From bae44c03b0b93e83cd20e9ea3920e6ff32a17699 Mon Sep 17 00:00:00 2001 From: zharchermind Date: Wed, 22 Jun 2022 20:46:36 +0800 Subject: [PATCH] Fix: Network endianness conversion that uses little-endian communication Signed-off-by: zharchermind --- .../common/include/softbus_adapter_socket.h | 9 +++ .../kernel/liteos_a/softbus_adapter_socket.c | 73 +++++++++++++++++++ core/authentication/src/auth_connection.c | 28 +++++-- core/authentication/src/auth_manager.c | 11 +++ core/authentication/src/auth_socket.c | 3 + .../ble/src/softbus_ble_connection.c | 3 + core/connection/br/src/br_trans_manager.c | 4 +- core/connection/common/conn_common.gni | 3 + .../include/softbus_datahead_transform.h | 29 ++++++++ .../common/src/softbus_datahead_transform.c | 69 ++++++++++++++++++ .../connection/manager/softbus_conn_manager.c | 3 +- .../tcp/src/softbus_tcp_connect_manager.c | 2 + .../proxy/src/softbus_proxychannel_message.c | 18 ++++- .../proxy/src/softbus_proxychannel_session.c | 53 ++++++++++++-- .../tcp_direct/src/trans_tcp_direct_message.c | 28 ++++++- .../src/client_trans_tcp_direct_message.c | 18 +++++ .../tcp_direct/trans_tcp_sdk.gni | 1 + 17 files changed, 337 insertions(+), 18 deletions(-) create mode 100755 core/connection/common/include/softbus_datahead_transform.h create mode 100755 core/connection/common/src/softbus_datahead_transform.c diff --git a/adapter/common/include/softbus_adapter_socket.h b/adapter/common/include/softbus_adapter_socket.h index 491ccb517c..58f9473ad1 100644 --- a/adapter/common/include/softbus_adapter_socket.h +++ b/adapter/common/include/softbus_adapter_socket.h @@ -152,6 +152,15 @@ uint16_t SoftBusHtoNs(uint16_t hostshort); uint32_t SoftBusNtoHl(uint32_t netlong); uint16_t SoftBusNtoHs(uint16_t netshort); +/* host to little-endian */ +uint16_t SoftBusHtoLs(uint16_t value); +uint32_t SoftBusHtoLl(uint32_t value); +uint64_t SoftBusHtoLll(uint64_t value); +/* little-endian to host */ +uint16_t SoftBusLtoHs(uint16_t value); +uint32_t SoftBusLtoHl(uint32_t value); +uint64_t SoftBusLtoHll(uint64_t value); + uint32_t SoftBusInetAddr(const char *cp); int32_t SoftBusSocketGetError(int32_t socketFd); diff --git a/adapter/common/kernel/liteos_a/softbus_adapter_socket.c b/adapter/common/kernel/liteos_a/softbus_adapter_socket.c index a0a6f7beb8..ab4a06ede4 100644 --- a/adapter/common/kernel/liteos_a/softbus_adapter_socket.c +++ b/adapter/common/kernel/liteos_a/softbus_adapter_socket.c @@ -30,6 +30,18 @@ #include "softbus_adapter_log.h" #include "softbus_def.h" +static void ShiftByte(uint8_t *in, int8_t inSize) +{ + int8_t left = 0; + int8_t right = inSize - 1; + while (left < right) { + in[left] ^= in[right]; + in[right] ^= in[left]; + in[left] ^= in[right]; + ++left; + --right; + } +} static int32_t GetErrorCode(void) { @@ -479,3 +491,64 @@ uint32_t SoftBusInetAddr(const char *cp) { return inet_addr(cp); } + +static bool IsLittleEndian(void) +{ + uint32_t data = 0x1; + if (data == ntohl(data)) { + return false; + } else { + return true; + } +} + +static void ProcByteOrder(uint8_t *value, int8_t size) +{ + if (IsLittleEndian()) { + return; + } + ShiftByte(value, size); + return; +} + +uint16_t SoftBusHtoLs(uint16_t value) +{ + uint16_t res = value; + ProcByteOrder((uint8_t *)&res, (int8_t)sizeof(res)); + return res; +} + +uint32_t SoftBusHtoLl(uint32_t value) +{ + uint32_t res = value; + ProcByteOrder((uint8_t *)&res, (int8_t)sizeof(res)); + return res; +} + +uint64_t SoftBusHtoLll(uint64_t value) +{ + uint64_t res = value; + ProcByteOrder((uint8_t *)&res, (int8_t)sizeof(res)); + return res; +} + +uint16_t SoftBusLtoHs(uint16_t value) +{ + uint16_t res = value; + ProcByteOrder((uint8_t *)&res, (int8_t)sizeof(res)); + return res; +} + +uint32_t SoftBusLtoHl(uint32_t value) +{ + uint32_t res = value; + ProcByteOrder((uint8_t *)&res, (int8_t)sizeof(res)); + return res; +} + +uint64_t SoftBusLtoHll(uint64_t value) +{ + uint64_t res = value; + ProcByteOrder((uint8_t *)&res, (int8_t)sizeof(res)); + return res; +} \ No newline at end of file diff --git a/core/authentication/src/auth_connection.c b/core/authentication/src/auth_connection.c index aa9c84d684..648f786239 100644 --- a/core/authentication/src/auth_connection.c +++ b/core/authentication/src/auth_connection.c @@ -25,6 +25,7 @@ #include "softbus_errcode.h" #include "softbus_json_utils.h" #include "softbus_log.h" +#include "softbus_adapter_socket.h" int32_t __attribute__ ((weak)) AuthSocketSendData(AuthManager *auth, const AuthDataHead *head, const uint8_t *data, uint32_t len) @@ -43,6 +44,15 @@ typedef struct { int32_t connModule; } PostDataInfo; +static void PackAuthDataInfo(AuthDataInfo *data) +{ + data->type = SoftBusHtoLl(data->type); + data->module = (int32_t)SoftBusHtoLl((uint32_t)data->module); + data->seq = (int64_t)SoftBusHtoLll((uint64_t)data->seq); + data->flag = (int32_t)SoftBusHtoLl((uint32_t)data->flag); + data->dataLen = SoftBusHtoLl(data->dataLen); +} + static int32_t PostDataByConn(const PostDataInfo *info, char *buf, uint32_t postDataLen) { int64_t seq = 0; @@ -72,16 +82,24 @@ static int32_t SetBufData(char *buf, const AuthManager *auth, const AuthDataHead const uint8_t *data, uint32_t len) { buf += ConnGetHeadSize(); + AuthDataInfo autoDataInfoHead = { + .type = head->dataType, + .module = head->module, + .seq = head->seq, + .flag = head->flag, + .dataLen = len, + }; + PackAuthDataInfo(&autoDataInfoHead); if (!IsWiFiLink(auth)) { - *(int32_t *)buf = head->dataType; + *(int32_t *)buf = autoDataInfoHead.type; buf += sizeof(int32_t); - *(int32_t *)buf = head->module; + *(int32_t *)buf = autoDataInfoHead.module; buf += sizeof(int32_t); - *(int64_t *)buf = head->seq; + *(int64_t *)buf = autoDataInfoHead.seq; buf += sizeof(int64_t); - *(int32_t *)buf = head->flag; + *(int32_t *)buf = autoDataInfoHead.flag; buf += sizeof(int32_t); - *(int32_t *)buf = len; + *(int32_t *)buf = autoDataInfoHead.dataLen; buf += sizeof(int32_t); } if (memcpy_s(buf, len, data, len) != EOK) { diff --git a/core/authentication/src/auth_manager.c b/core/authentication/src/auth_manager.c index 7b72da009f..f569a99307 100644 --- a/core/authentication/src/auth_manager.c +++ b/core/authentication/src/auth_manager.c @@ -29,6 +29,7 @@ #include "softbus_adapter_thread.h" #include "softbus_base_listener.h" #include "softbus_conn_interface.h" +#include "softbus_adapter_socket.h" #include "softbus_errcode.h" #include "softbus_json_utils.h" #include "softbus_log.h" @@ -77,6 +78,15 @@ int32_t __attribute__ ((weak)) OpenAuthServer(void) return SOFTBUS_ERR; } +static void UnpackAuthDataInfo(AuthDataInfo *data) +{ + data->type = SoftBusLtoHl(data->type); + data->module = (int32_t)SoftBusLtoHl((uint32_t)data->module); + data->seq = (int64_t)SoftBusLtoHll((uint64_t)data->seq); + data->flag = (int32_t)SoftBusLtoHl((uint32_t)data->flag); + data->dataLen = SoftBusLtoHl(data->dataLen); +} + static int32_t EventInLooper(uint16_t id) { SoftBusMessage *msgDelay = (SoftBusMessage *)SoftBusMalloc(sizeof(SoftBusMessage)); @@ -903,6 +913,7 @@ static int32_t AnalysisData(char *data, uint32_t len, AuthDataInfo *info) info->flag = *(int32_t *)data; data += sizeof(int32_t); info->dataLen = *(uint32_t *)data; + UnpackAuthDataInfo(info); if ((info->dataLen + sizeof(AuthDataInfo)) > len) { return SOFTBUS_ERR; } diff --git a/core/authentication/src/auth_socket.c b/core/authentication/src/auth_socket.c index 1355f36397..1f38e1657e 100644 --- a/core/authentication/src/auth_socket.c +++ b/core/authentication/src/auth_socket.c @@ -22,6 +22,7 @@ #include "bus_center_manager.h" #include "softbus_adapter_mem.h" #include "softbus_base_listener.h" +#include "softbus_datahead_transform.h" #include "softbus_errcode.h" #include "softbus_log.h" #include "softbus_tcp_socket.h" @@ -231,6 +232,7 @@ static int32_t AuthOnDataEvent(int32_t events, int32_t fd) ConnPktHead head = {0}; len = RecvTcpData(fd, (void *)&head, headSize, 0); + UnpackConnPktHead(&head); if (len < (int32_t)headSize) { if (len < 0) { SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth RecvTcpData failed, DelTrigger"); @@ -284,6 +286,7 @@ int32_t AuthSocketSendData(AuthManager *auth, const AuthDataHead *head, const ui return SOFTBUS_ERR; } connPostData = buf; + PackConnPktHead(ðHead); if (memcpy_s(buf, sizeof(ConnPktHead), ðHead, sizeof(ConnPktHead)) != EOK) { SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "memcpy_s failed"); SoftBusFree(connPostData); diff --git a/core/connection/ble/src/softbus_ble_connection.c b/core/connection/ble/src/softbus_ble_connection.c index 48e1109d7a..f70adf9220 100644 --- a/core/connection/ble/src/softbus_ble_connection.c +++ b/core/connection/ble/src/softbus_ble_connection.c @@ -35,6 +35,7 @@ #include "softbus_conn_manager.h" #include "softbus_common.h" #include "softbus_def.h" +#include "softbus_datahead_transform.h" #include "softbus_errcode.h" #include "softbus_json_utils.h" #include "softbus_log.h" @@ -516,6 +517,7 @@ static void SendRefMessage(int32_t delta, int32_t connectionId, int32_t count, i head.seq = 1; head.flag = 0; head.len = strlen(data) + 1; + PackConnPktHead(&head); if (memcpy_s(buf, dataLen, (void *)&head, headSize)) { SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "memcpy_s head error"); cJSON_free(data); @@ -1057,6 +1059,7 @@ static void BleOnDataReceived(bool isBleConn, BleHalConnInfo halConnInfo, uint32 } if (isBleConn) { ConnPktHead *head = (ConnPktHead *)value; + UnpackConnPktHead(head); if (head->module == MODULE_CONNECTION) { cJSON *data = NULL; data = cJSON_Parse(value + sizeof(ConnPktHead)); diff --git a/core/connection/br/src/br_trans_manager.c b/core/connection/br/src/br_trans_manager.c index ec1f8f3bab..c4ddc636b9 100644 --- a/core/connection/br/src/br_trans_manager.c +++ b/core/connection/br/src/br_trans_manager.c @@ -19,6 +19,7 @@ #include "securec.h" #include "softbus_adapter_mem.h" +#include "softbus_datahead_transform.h" #include "softbus_conn_interface.h" #include "softbus_conn_manager.h" #include "softbus_def.h" @@ -33,6 +34,7 @@ static int32_t ReceivedHeadCheck(BrConnectionInfo *conn) return SOFTBUS_ERR; } ConnPktHead *head = (ConnPktHead *)(conn->recvBuf); + UnpackConnPktHead(head); if ((uint32_t)(head->magic) != MAGIC_NUMBER) { conn->recvPos = 0; SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[ReceivedHeadCheck] magic error 0x%x", head->magic); @@ -224,7 +226,7 @@ char *BrPackRequestOrResponse(int32_t requestOrResponse, int32_t delta, uint64_t head.seq = 1; head.flag = 0; head.len = strlen(data) + 1; - + PackConnPktHead(&head); if (memcpy_s(buf, dataLen, (void *)&head, headSize) != EOK) { SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "memcpy_s head error"); cJSON_free(data); diff --git a/core/connection/common/conn_common.gni b/core/connection/common/conn_common.gni index 2a00cd142a..0c4c794c87 100644 --- a/core/connection/common/conn_common.gni +++ b/core/connection/common/conn_common.gni @@ -16,8 +16,11 @@ conn_common_src = [ "$dsoftbus_root_path/core/connection/common/src/softbus_base_listener.c", "$dsoftbus_root_path/core/connection/common/src/softbus_tcp_socket.c", "$dsoftbus_root_path/core/connection/common/src/softbus_thread_pool.c", + "$dsoftbus_root_path/core/connection/common/src/softbus_datahead_transform.c", ] conn_common_inc = [ "$dsoftbus_root_path/core/connection/interface", "$dsoftbus_root_path/core/connection/common/include", + "$dsoftbus_root_path/core/connection/manager", + "$dsoftbus_root_path/core/transmission/trans_channel/proxy/include", ] diff --git a/core/connection/common/include/softbus_datahead_transform.h b/core/connection/common/include/softbus_datahead_transform.h new file mode 100755 index 0000000000..836d676d51 --- /dev/null +++ b/core/connection/common/include/softbus_datahead_transform.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SOFTBUS_DATAHEAD_TRANSFORM_H +#define SOFTBUS_DATAHEAD_TRANSFORM_H + +#include +#include +#include "softbus_conn_manager.h" +#include "softbus_proxychannel_message.h" + +void PackConnPktHead(ConnPktHead *data); +void UnpackConnPktHead(ConnPktHead *data); +void UnpackProxyMessageHead(ProxyMessageHead *msg); +void PackProxyMessageHead(ProxyMessageHead *msg); + +#endif /* SOFTBUS_DATAHEAD_CONVER_H */ \ No newline at end of file diff --git a/core/connection/common/src/softbus_datahead_transform.c b/core/connection/common/src/softbus_datahead_transform.c new file mode 100755 index 0000000000..310bf04be6 --- /dev/null +++ b/core/connection/common/src/softbus_datahead_transform.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "softbus_datahead_transform.h" +#include +#include +#include +#include +#include + +#include "softbus_adapter_errcode.h" +#include "softbus_errcode.h" +#include "softbus_log.h" +#include "softbus_adapter_socket.h" + +void PackConnPktHead(ConnPktHead *data) +{ + if (data == NULL) { + return; + } + data->magic = (int32_t)SoftBusHtoLl((uint32_t)data->magic); + data->flag = (int32_t)SoftBusHtoLl((uint32_t)data->flag); + data->module = (int32_t)SoftBusHtoLl((uint32_t)data->module); + data->len = SoftBusHtoLl(data->len); + data->seq = (int64_t)SoftBusHtoLll((uint64_t)data->seq); +} + +void UnpackConnPktHead(ConnPktHead *data) +{ + if (data == NULL) { + return; + } + data->magic = (int32_t)SoftBusLtoHl((uint32_t)data->magic); + data->flag = (int32_t)SoftBusLtoHl((uint32_t)data->flag); + data->module = (int32_t)SoftBusLtoHl((uint32_t)data->module); + data->len = SoftBusLtoHl(data->len); + data->seq = (int64_t)SoftBusLtoHll((uint64_t)data->seq); +} + +void PackProxyMessageHead(ProxyMessageHead *msg) +{ + if (msg == NULL) { + return; + } + msg->myId = (int16_t)SoftBusHtoLs((uint16_t)msg->myId); + msg->peerId = (int16_t)SoftBusHtoLs((uint16_t)msg->peerId); + msg->reserved = (int16_t)SoftBusHtoLs((uint16_t)msg->reserved); +} + +void UnpackProxyMessageHead(ProxyMessageHead *msg) +{ + if (msg == NULL) { + return; + } + msg->peerId = (int16_t)SoftBusLtoHs((uint16_t)msg->peerId); + msg->myId = (int16_t)SoftBusLtoHs((uint16_t)msg->myId); + msg->reserved = (int16_t)SoftBusLtoHs((uint16_t)msg->reserved); +} \ No newline at end of file diff --git a/core/connection/manager/softbus_conn_manager.c b/core/connection/manager/softbus_conn_manager.c index f0fbcea1c6..6c668fee7b 100644 --- a/core/connection/manager/softbus_conn_manager.c +++ b/core/connection/manager/softbus_conn_manager.c @@ -24,6 +24,7 @@ #include "softbus_ble_connection.h" #include "softbus_conn_interface.h" #include "softbus_def.h" +#include "softbus_datahead_transform.h" #include "softbus_errcode.h" #include "softbus_feature_config.h" #include "softbus_log.h" @@ -353,7 +354,7 @@ int32_t ConnPostBytes(uint32_t connectionId, ConnPostData *data) head->module = data->module; head->len = data->len - sizeof(ConnPktHead); head->seq = data->seq; - + PackConnPktHead(head); return g_connManager[type]->PostBytes(connectionId, data->buf, (int32_t)(data->len), data->pid, data->flag); } diff --git a/core/connection/tcp/src/softbus_tcp_connect_manager.c b/core/connection/tcp/src/softbus_tcp_connect_manager.c index eb848f7348..b7dfc413c8 100644 --- a/core/connection/tcp/src/softbus_tcp_connect_manager.c +++ b/core/connection/tcp/src/softbus_tcp_connect_manager.c @@ -24,6 +24,7 @@ #include "softbus_conn_interface.h" #include "softbus_conn_manager.h" #include "softbus_def.h" +#include "softbus_datahead_transform.h" #include "softbus_errcode.h" #include "softbus_feature_config.h" #include "softbus_log.h" @@ -282,6 +283,7 @@ int32_t TcpOnDataEventIn(int32_t fd) ConnPktHead head; uint32_t headSize = sizeof(ConnPktHead); ssize_t bytes = RecvTcpData(fd, (char *)&head, headSize, g_tcpTimeOut); + UnpackConnPktHead(&head); if (bytes <= 0) { SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "TcpOnDataEvent Disconnect fd:%d", fd); DelTcpConnInfo(connectionId); diff --git a/core/transmission/trans_channel/proxy/src/softbus_proxychannel_message.c b/core/transmission/trans_channel/proxy/src/softbus_proxychannel_message.c index b19358c4e1..6f6f6dddff 100644 --- a/core/transmission/trans_channel/proxy/src/softbus_proxychannel_message.c +++ b/core/transmission/trans_channel/proxy/src/softbus_proxychannel_message.c @@ -27,6 +27,7 @@ #include "softbus_proxychannel_manager.h" #include "softbus_proxychannel_transceiver.h" #include "softbus_utils.h" +#include "softbus_datahead_transform.h" static int32_t TransProxyParseMessageHead(char *data, int32_t len, ProxyMessage *msg) { @@ -48,6 +49,8 @@ static int32_t TransProxyParseMessageHead(char *data, int32_t len, ProxyMessage msg->msgHead.myId = *(int16_t *)ptr; msg->data = data + sizeof(ProxyMessageHead); msg->dateLen = len - sizeof(ProxyMessageHead); + UnpackProxyMessageHead(&msg->msgHead); + return SOFTBUS_OK; } @@ -192,6 +195,7 @@ static int32_t GetEncryptSeqByConnId(uint32_t connId, ConnectType *type, int32_t static uint8_t *PackPlaintextMessage(ProxyMessageHead *msg, const uint8_t *payload, uint32_t payloadLen, uint32_t *outLen) { + ProxyMessageHead proxyMessageHead; uint32_t connHeadLen = ConnGetHeadSize(); uint32_t size = PROXY_CHANNEL_HEAD_LEN + connHeadLen + payloadLen; uint8_t *buf = (uint8_t *)SoftBusCalloc(size); @@ -199,7 +203,11 @@ static uint8_t *PackPlaintextMessage(ProxyMessageHead *msg, const uint8_t *paylo SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "malloc proxy buf fail"); return NULL; } - if (memcpy_s(buf + connHeadLen, size - connHeadLen, msg, sizeof(ProxyMessageHead)) != EOK) { + if (memcpy_s(&proxyMessageHead, sizeof(ProxyMessageHead), msg, sizeof(ProxyMessageHead)) != EOK) { + return NULL; + } + PackProxyMessageHead(&proxyMessageHead); + if (memcpy_s(buf + connHeadLen, size - connHeadLen, &proxyMessageHead, sizeof(ProxyMessageHead)) != EOK) { SoftBusFree(buf); return NULL; } @@ -220,7 +228,7 @@ static uint8_t *PackEncrypedMessage(ProxyMessageHead *msg, uint32_t connId, int32_t encSeq = 0; uint32_t connHeadLen = ConnGetHeadSize(); AuthSideFlag authSide = AUTH_SIDE_ANY; - + ProxyMessageHead proxyMessageHead; if (GetEncryptSeqByConnId(connId, &connType, &encSeq) != SOFTBUS_OK) { SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "GetEncryptSeqByConnId fail connId[%u]", connId); return NULL; @@ -246,7 +254,11 @@ static uint8_t *PackEncrypedMessage(ProxyMessageHead *msg, uint32_t connId, if (connType == CONNECT_BLE) { msg->chiper = msg->chiper | USE_BLE_CIPHER; } - if (memcpy_s(buf + connHeadLen, size - connHeadLen, msg, sizeof(ProxyMessageHead)) != EOK) { + if (memcpy_s(&proxyMessageHead, sizeof(ProxyMessageHead), msg, sizeof(ProxyMessageHead)) != EOK) { + return NULL; + } + PackProxyMessageHead(&proxyMessageHead); + if (memcpy_s(buf + connHeadLen, size - connHeadLen, &proxyMessageHead, sizeof(ProxyMessageHead)) != EOK) { SoftBusFree(buf); return NULL; } diff --git a/core/transmission/trans_channel/proxy/src/softbus_proxychannel_session.c b/core/transmission/trans_channel/proxy/src/softbus_proxychannel_session.c index d7e56a7cb6..a8ffc8d114 100644 --- a/core/transmission/trans_channel/proxy/src/softbus_proxychannel_session.c +++ b/core/transmission/trans_channel/proxy/src/softbus_proxychannel_session.c @@ -32,6 +32,7 @@ #include "softbus_transmission_interface.h" #include "softbus_utils.h" #include "trans_pending_pkt.h" +#include "softbus_datahead_transform.h" #define MSG_SLICE_HEAD_LEN (sizeof(SliceHead) + sizeof(ProxyMessageHead)) #define PROXY_ACK_SIZE 4 @@ -57,6 +58,38 @@ typedef struct { static SoftBusList *g_channelSliceProcessorList = NULL; int32_t TransProxyTransDataSendMsg(int32_t channelId, const char *payLoad, int payLoadLen, ProxyPacketType flag); +void PackSliceHead(SliceHead *data) +{ + data->priority = (int32_t)SoftBusHtoLl((uint32_t)data->priority); + data->sliceNum = (int32_t)SoftBusHtoLl((uint32_t)data->sliceNum); + data->sliceSeq = (int32_t)SoftBusHtoLl((uint32_t)data->sliceSeq); + data->reserved = (int32_t)SoftBusHtoLl((uint32_t)data->reserved); +} + +void UnPackSliceHead(SliceHead *data) +{ + data->priority = (int32_t)SoftBusLtoHl((uint32_t)data->priority); + data->sliceNum = (int32_t)SoftBusLtoHl((uint32_t)data->sliceNum); + data->sliceSeq = (int32_t)SoftBusLtoHl((uint32_t)data->sliceSeq); + data->reserved = (int32_t)SoftBusLtoHl((uint32_t)data->reserved); +} + +void PackPacketHead(PacketHead *data) +{ + data->magicNumber = (int32_t)SoftBusHtoLl((uint32_t)data->magicNumber); + data->seq = (int32_t)SoftBusHtoLl((uint32_t)data->seq); + data->flags = (int32_t)SoftBusHtoLl((uint32_t)data->flags); + data->dataLen = (int32_t)SoftBusHtoLl((uint32_t)data->dataLen); +} + +void UnPackPacketHead(PacketHead *data) +{ + data->magicNumber = (int32_t)SoftBusLtoHl((uint32_t)data->magicNumber); + data->seq = (int32_t)SoftBusLtoHl((uint32_t)data->seq); + data->flags = (int32_t)SoftBusLtoHl((uint32_t)data->flags); + data->dataLen = (int32_t)SoftBusLtoHl((uint32_t)data->dataLen); +} + int32_t NotifyClientMsgReceived(const char *pkgName, int32_t channelId, const char *data, uint32_t len, SessionPktType type) { @@ -221,6 +254,7 @@ static int32_t TransProxyPackBytes(int32_t channelId, ProxyDataInfo *dataInfo, P pktHead->seq = seq; pktHead->flags = flag; pktHead->dataLen = (int32_t)enDataInfo.outLen; + PackPacketHead(pktHead); *outseq = seq; dataInfo->outData = outBuf; dataInfo->outLen = outBufLen; @@ -328,7 +362,8 @@ static char *TransProxyPackAppNormalMsg(const ProxyMessageHead *msg, const Slice uint32_t bufLen; uint32_t connHeadLen; uint32_t dstLen; - + ProxyMessageHead proxyMessageHead; + SliceHead sliceHeadTemp; connHeadLen = ConnGetHeadSize(); bufLen = PROXY_CHANNEL_HEAD_LEN + connHeadLen + (uint32_t)datalen; if (sliceHead != NULL) { @@ -338,14 +373,21 @@ static char *TransProxyPackAppNormalMsg(const ProxyMessageHead *msg, const Slice if (buf == NULL) { return NULL; } - - if (memcpy_s(buf + connHeadLen, bufLen - connHeadLen, msg, sizeof(ProxyMessageHead)) != EOK) { + if (memcpy_s(&proxyMessageHead, sizeof(ProxyMessageHead), msg, sizeof(ProxyMessageHead)) != EOK) { + return NULL; + } + PackProxyMessageHead(&proxyMessageHead); + if (memcpy_s(buf + connHeadLen, bufLen - connHeadLen, &proxyMessageHead, sizeof(ProxyMessageHead)) != EOK) { SoftBusFree(buf); return NULL; } if (sliceHead != NULL) { dstLen = bufLen - connHeadLen - sizeof(ProxyMessageHead); - if (memcpy_s(buf + connHeadLen + sizeof(ProxyMessageHead), dstLen, sliceHead, sizeof(SliceHead)) != EOK) { + if (memcpy_s(&sliceHeadTemp, sizeof(SliceHead), sliceHead, sizeof(SliceHead)) != EOK) { + return NULL; + } + PackSliceHead(&sliceHeadTemp); + if (memcpy_s(buf + connHeadLen + sizeof(ProxyMessageHead), dstLen, &sliceHeadTemp, sizeof(SliceHead)) != EOK) { SoftBusFree(buf); return NULL; } @@ -642,6 +684,7 @@ static int32_t TransProxyProcessSessionData(const char *pkgName, int32_t channel static int32_t TransProxyNoSubPacketProc(const char *pkgName, int32_t channelId, const char *data, uint32_t len) { PacketHead *head = (PacketHead*)data; + UnPackPacketHead(head); if ((uint32_t)head->magicNumber != MAGIC_NUMBER) { SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "invalid magicNumber %x", head->magicNumber); return SOFTBUS_ERR; @@ -855,8 +898,8 @@ int32_t TransOnNormalMsgReceived(const char *pkgName, int32_t channelId, const c SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "data null or len %d error", len); return SOFTBUS_ERR; } - headSlice = (SliceHead *)data; + UnPackSliceHead(headSlice); if (TransProxyCheckSliceHead(headSlice)) { SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "invalid slihead"); return SOFTBUS_TRANS_PROXY_INVALID_SLICE_HEAD; diff --git a/core/transmission/trans_channel/tcp_direct/src/trans_tcp_direct_message.c b/core/transmission/trans_channel/tcp_direct/src/trans_tcp_direct_message.c index 0032edd025..d1472f06ce 100644 --- a/core/transmission/trans_channel/tcp_direct/src/trans_tcp_direct_message.c +++ b/core/transmission/trans_channel/tcp_direct/src/trans_tcp_direct_message.c @@ -25,6 +25,7 @@ #include "softbus_adapter_crypto.h" #include "softbus_adapter_mem.h" #include "softbus_adapter_thread.h" +#include "softbus_adapter_socket.h" #include "softbus_errcode.h" #include "softbus_log.h" #include "softbus_message_open_channel.h" @@ -54,6 +55,24 @@ typedef struct { static SoftBusList *g_tcpSrvDataList = NULL; +static void PackTdcPacketHead(TdcPacketHead *data) +{ + data->magicNumber = SoftBusHtoLl(data->magicNumber); + data->module = SoftBusHtoLl(data->module); + data->seq = SoftBusHtoLll(data->seq); + data->flags = SoftBusHtoLl(data->flags); + data->dataLen = SoftBusHtoLl(data->dataLen); +} + +static void UnpackTdcPacketHead(TdcPacketHead *data) +{ + data->magicNumber = SoftBusLtoHl(data->magicNumber); + data->module = SoftBusLtoHl(data->module); + data->seq = SoftBusLtoHll(data->seq); + data->flags = SoftBusLtoHl(data->flags); + data->dataLen = SoftBusLtoHl(data->dataLen); +} + int32_t TransSrvDataListInit(void) { if (g_tcpSrvDataList != NULL) { @@ -322,12 +341,14 @@ static int32_t PackBytes(int32_t channelId, const char *data, TdcPacketHead *pac if (GetMsgTypeByCipherFlags(packetHead->flags) == FLAG_REQUEST && side == SERVER_SIDE_FLAG) { packetHead->seq = packetHead->seq | AUTH_CONN_SERVER_SIDE; } + + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "side=%d, flag=0x%x, seq=%" PRIu64, + side, packetHead->flags, packetHead->seq); + + PackTdcPacketHead(packetHead); if (memcpy_s(buffer, bufLen, packetHead, sizeof(TdcPacketHead)) != EOK) { return SOFTBUS_MEM_ERR; } - - SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "side=%d, flag=0x%x, seq=%" PRIu64, - side, packetHead->flags, packetHead->seq); return SOFTBUS_OK; } @@ -708,6 +729,7 @@ static int32_t TransTdcSrvProcData(ListenerModule module, int32_t channelId) } TdcPacketHead *pktHead = (TdcPacketHead *)(node->data); + UnpackTdcPacketHead(pktHead); if (pktHead->magicNumber != MAGIC_NUMBER) { SoftBusMutexUnlock(&g_tcpSrvDataList->lock); SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv recv invalid packet head"); diff --git a/sdk/transmission/trans_channel/tcp_direct/src/client_trans_tcp_direct_message.c b/sdk/transmission/trans_channel/tcp_direct/src/client_trans_tcp_direct_message.c index 608c13186c..b386dac755 100644 --- a/sdk/transmission/trans_channel/tcp_direct/src/client_trans_tcp_direct_message.c +++ b/sdk/transmission/trans_channel/tcp_direct/src/client_trans_tcp_direct_message.c @@ -51,6 +51,22 @@ typedef struct { static uint32_t g_dataBufferMaxLen = 0; static SoftBusList *g_tcpDataList = NULL; +static void PackTcpDataPacketHead(TcpDataPacketHead *data) +{ + data->magicNumber = SoftBusHtoLl(data->magicNumber); + data->seq = (int32_t)SoftBusHtoLl((uint32_t)data->seq); + data->flags = SoftBusHtoLl(data->flags); + data->dataLen = SoftBusHtoLl(data->dataLen); +} + +static void UnpackTcpDataPacketHead(TcpDataPacketHead *data) +{ + data->magicNumber = SoftBusLtoHl(data->magicNumber); + data->seq = (int32_t)SoftBusLtoHl((uint32_t)data->seq); + data->flags = SoftBusLtoHl(data->flags); + data->dataLen = SoftBusLtoHl(data->dataLen); +} + static int32_t TransTdcDecrypt(const char *sessionKey, const char *in, uint32_t inLen, char *out, uint32_t *outLen) { AesGcmCipherKey cipherKey = {0}; @@ -119,6 +135,7 @@ static char *TransTdcPackData(const TcpDirectChannelInfo *channel, const char *d .flags = flags, .dataLen = dataLen, }; + PackTcpDataPacketHead(&pktHead); if (memcpy_s(buf, DC_DATA_HEAD_SIZE, &pktHead, sizeof(TcpDataPacketHead)) != EOK) { SoftBusFree(buf); SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "memcpy_s error"); @@ -415,6 +432,7 @@ static int32_t TransTdcProcAllData(int32_t channelId) } TcpDataPacketHead *pktHead = (TcpDataPacketHead *)(node->data); + UnpackTcpDataPacketHead(pktHead); if (pktHead->magicNumber != MAGIC_NUMBER) { SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "invalid data packet head"); SoftBusMutexUnlock(&g_tcpDataList->lock); diff --git a/sdk/transmission/trans_channel/tcp_direct/trans_tcp_sdk.gni b/sdk/transmission/trans_channel/tcp_direct/trans_tcp_sdk.gni index 5c7a17bbba..03798312f4 100644 --- a/sdk/transmission/trans_channel/tcp_direct/trans_tcp_sdk.gni +++ b/sdk/transmission/trans_channel/tcp_direct/trans_tcp_sdk.gni @@ -28,5 +28,6 @@ if (defined(ohos_lite)) { trans_direct_channel_sdk_inc += [ "$dsoftbus_root_path/core/common/security/sequence_verification/include", "$dsoftbus_root_path/core/common/wifi_common/tcp_socket/include", + "$dsoftbus_root_path/adapter/common/include", ] } -- Gitee