diff --git a/core/frame/small/init/src/trans_server_stub.c b/core/frame/small/init/src/trans_server_stub.c index ba89b8deb93c3428db355426238d91314ffd8140..5bcf38cab5a8ecd2ef12815d2fc7e6be68345962 100644 --- a/core/frame/small/init/src/trans_server_stub.c +++ b/core/frame/small/init/src/trans_server_stub.c @@ -97,6 +97,48 @@ static int32_t CheckOpenSessionPremission(const char *sessionName, const char *p return SOFTBUS_OK; } +static void ServerReadSessionAttrs(IpcIo *req, SessionAttribute *getAttr) +{ + if (getAttr == NULL || req == NULL) { + SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "ReadSessionAttrs getAttr is NULL"); + return; + } + LinkType *pGetArr = NULL; + + if (!ReadInt32(req, &getAttr->dataType)) { + SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "read dataType failed"); + return; + } + + if (!ReadInt32(req, &getAttr->linkTypeNum)) { + SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "read linkTypeNum failed"); + return; + } + + if (getAttr->linkTypeNum > 0) { + pGetArr = (LinkType *)ReadBuffer(req, sizeof(LinkType) * getAttr->linkTypeNum); + } + + if (pGetArr != NULL && getAttr->linkTypeNum <= LINK_TYPE_MAX) { + (void)memcpy_s(getAttr->linkType, sizeof(LinkType) * LINK_TYPE_MAX, + pGetArr, sizeof(LinkType) * getAttr->linkTypeNum); + } + + if (!ReadInt32(req, &getAttr->attr.streamAttr.streamType)) { + SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "read streamType failed"); + return; + } + + if (!ReadUint16(req, &getAttr->fastTransDataSize)) { + SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "read fastTransDataSize failed"); + return; + } + + if (getAttr->fastTransDataSize != 0) { + getAttr->fastTransData = (uint8_t *)ReadRawData(req, getAttr->fastTransDataSize); + } +} + int32_t ServerOpenSession(IpcIo *req, IpcIo *reply) { SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_INFO, "open session ipc server pop"); @@ -108,6 +150,9 @@ int32_t ServerOpenSession(IpcIo *req, IpcIo *reply) int32_t ret; uint32_t size; SessionParam param; + SessionAttribute getAttr; + (void)memset_s(¶m, sizeof(SessionParam), 0, sizeof(SessionParam)); + (void)memset_s(&getAttr, sizeof(SessionAttribute), 0, sizeof(SessionAttribute)); TransSerializer transSerializer; transSerializer.transInfo.channelId = INVALID_CHANNEL_ID; transSerializer.transInfo.channelType = CHANNEL_TYPE_BUTT; @@ -115,7 +160,8 @@ int32_t ServerOpenSession(IpcIo *req, IpcIo *reply) param.peerSessionName = (const char *)ReadString(req, &size); param.peerDeviceId = (const char *)ReadString(req, &size); param.groupId = (const char *)ReadString(req, &size); - param.attr = (SessionAttribute *)ReadRawData(req, sizeof(SessionAttribute)); + ServerReadSessionAttrs(req, &getAttr); + param.attr = &getAttr; ret = CheckOpenSessionPremission(param.sessionName, param.peerSessionName); if (ret != SOFTBUS_OK) { diff --git a/core/frame/standard/init/src/softbus_server_stub.cpp b/core/frame/standard/init/src/softbus_server_stub.cpp index f560806da220694e3aa814d65b0d7ea9dd8bf710..64fdcb6a217cb161dee785ac28b33392c17530a3 100644 --- a/core/frame/standard/init/src/softbus_server_stub.cpp +++ b/core/frame/standard/init/src/softbus_server_stub.cpp @@ -508,11 +508,41 @@ EXIT: return SOFTBUS_OK; } +static void ReadSessionAttrs(MessageParcel &data, SessionAttribute *getAttr) +{ + if (getAttr == nullptr) { + SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "ReadSessionAttrs getAttr is nullptr"); + return; + } + LinkType *pGetArr = nullptr; + + getAttr->dataType = data.ReadInt32(); + getAttr->linkTypeNum = data.ReadInt32(); + + if (getAttr->linkTypeNum > 0) { + pGetArr = (LinkType *)data.ReadBuffer(sizeof(LinkType) * getAttr->linkTypeNum); + } + + if (pGetArr != nullptr && getAttr->linkTypeNum <= LINK_TYPE_MAX) { + (void)memcpy_s(getAttr->linkType, sizeof(LinkType) * LINK_TYPE_MAX, + pGetArr, sizeof(LinkType) * getAttr->linkTypeNum); + } + + getAttr->attr.streamAttr.streamType = data.ReadInt32(); + getAttr->fastTransDataSize = data.ReadUint16(); + if (getAttr->fastTransDataSize != 0) { + getAttr->fastTransData = (uint8_t *)data.ReadRawData(getAttr->fastTransDataSize); + } +} + int32_t SoftBusServerStub::OpenSessionInner(MessageParcel &data, MessageParcel &reply) { int32_t retReply; SessionParam param; + SessionAttribute getAttr; (void)memset_s(¶m, sizeof(SessionParam), 0, sizeof(SessionParam)); + (void)memset_s(&getAttr, sizeof(SessionAttribute), 0, sizeof(SessionAttribute)); + TransSerializer transSerializer; int64_t timeStart = 0; int64_t timediff = 0; @@ -521,9 +551,11 @@ int32_t SoftBusServerStub::OpenSessionInner(MessageParcel &data, MessageParcel & param.peerSessionName = data.ReadCString(); param.peerDeviceId = data.ReadCString(); param.groupId = data.ReadCString(); - param.attr = (SessionAttribute *)data.ReadRawData(sizeof(SessionAttribute)); + ReadSessionAttrs(data, &getAttr); + param.attr = &getAttr; + if (param.sessionName == nullptr || param.peerSessionName == nullptr || param.peerDeviceId == nullptr || - param.groupId == nullptr || param.attr == nullptr) { + param.groupId == nullptr) { retReply = SOFTBUS_INVALID_PARAM; goto EXIT; } diff --git a/sdk/transmission/ipc/small/trans_server_proxy.c b/sdk/transmission/ipc/small/trans_server_proxy.c index 01c88bc08ab29c000283672e0248ae7a9ac36490..a21aed16140c364d5cf0cf54d4423a232b0b41ba 100644 --- a/sdk/transmission/ipc/small/trans_server_proxy.c +++ b/sdk/transmission/ipc/small/trans_server_proxy.c @@ -154,6 +154,54 @@ int32_t ServerIpcRemoveSessionServer(const char *pkgName, const char *sessionNam return ret; } +static bool TransWriteIpcSessionAttrs(IpcIo *request, const SessionAttribute *attrs) +{ + if (attrs == NULL || request == NULL) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "attrs is nullptr!"); + return false; + } + + if (!WriteInt32(request, attrs->dataType)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs dataType failed!"); + return false; + } + + if (!WriteInt32(request, attrs->linkTypeNum)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs linkTypeNum failed!"); + return false; + } + + if (attrs->linkTypeNum > 0) { + if (!WriteBuffer(request, attrs->linkType, sizeof(LinkType) * attrs->linkTypeNum)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs linkType failed!"); + return false; + } + } + + if (!WriteInt32(request, attrs->attr.streamAttr.streamType)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs streamAttr failed!"); + return false; + } + + if (attrs->fastTransData != NULL) { + if (!WriteUint16(request, attrs->fastTransDataSize)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs fastTransDataSize failed!"); + return false; + } + if (!WriteRawData(request, attrs->fastTransData, attrs->fastTransDataSize)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs fastTransData failed!"); + return false; + } + } else { + if (!WriteUint16(request, 0)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs fastTransDataSize failed!"); + return false; + } + } + + return true; +} + int32_t ServerIpcOpenSession(const SessionParam *param, TransInfo *info) { SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ServerIpcOpenSession"); @@ -165,8 +213,8 @@ int32_t ServerIpcOpenSession(const SessionParam *param, TransInfo *info) WriteString(&request, param->peerSessionName); WriteString(&request, param->peerDeviceId); WriteString(&request, param->groupId); - bool value = WriteRawData(&request, (void*)param->attr, sizeof(SessionAttribute)); - if (!value) { + if (!TransWriteIpcSessionAttrs(&request, param->attr)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write attr failed!"); return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED; } diff --git a/sdk/transmission/ipc/standard/src/trans_server_proxy_standard.cpp b/sdk/transmission/ipc/standard/src/trans_server_proxy_standard.cpp index e49ab98c009a86177fb3cbd6e1aa05a9ee20d7d3..bc0412729a4fda6ccbefe49405600ab44636c605 100644 --- a/sdk/transmission/ipc/standard/src/trans_server_proxy_standard.cpp +++ b/sdk/transmission/ipc/standard/src/trans_server_proxy_standard.cpp @@ -157,6 +157,54 @@ int32_t TransServerProxy::RemoveSessionServer(const char *pkgName, const char *s return serverRet; } +static bool TransWriteSessionAttrs(const SessionAttribute *attrs, MessageParcel &data) +{ + if (attrs == nullptr) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "attrs is nullptr!"); + return false; + } + + if (!data.WriteInt32(attrs->dataType)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs dataType failed!"); + return false; + } + + if (!data.WriteInt32(attrs->linkTypeNum)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs linkTypeNum failed!"); + return false; + } + + if (attrs->linkTypeNum > 0) { + if (!data.WriteBuffer(attrs->linkType, sizeof(LinkType) * attrs->linkTypeNum)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs linkType failed!"); + return false; + } + } + + if (!data.WriteInt32(attrs->attr.streamAttr.streamType)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs streamAttr failed!"); + return false; + } + + if (attrs->fastTransData != nullptr) { + if (!data.WriteUint16(attrs->fastTransDataSize)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs fastTransDataSize failed!"); + return false; + } + if (!data.WriteRawData(attrs->fastTransData, attrs->fastTransDataSize)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs fastTransData failed!"); + return false; + } + } else { + if (!data.WriteUint16(0)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write my attrs fastTransDataSize failed!"); + return false; + } + } + + return true; +} + int32_t TransServerProxy::OpenSession(const SessionParam *param, TransInfo *info) { if (param->sessionName == nullptr || param->peerSessionName == nullptr || @@ -191,10 +239,11 @@ int32_t TransServerProxy::OpenSession(const SessionParam *param, TransInfo *info return SOFTBUS_TRANS_PROXY_WRITECSTRING_FAILED; } - if (!data.WriteRawData(param->attr, sizeof(SessionAttribute))) { - SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write addr type length failed!"); + if (!TransWriteSessionAttrs(param->attr, data)) { + SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenSession write attr failed!"); return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED; } + MessageParcel reply; MessageOption option; if (remote->SendRequest(SERVER_OPEN_SESSION, data, reply, option) != 0) {