From 4e64310020d6e4d961b99d3f447d7d75e33740be Mon Sep 17 00:00:00 2001 From: Lby Date: Sat, 13 Sep 2025 17:29:01 +0800 Subject: [PATCH] trans support serviceId Signed-off-by: Lby --- .../common/softbus_access_token_adapter.cpp | 34 ++++- .../softbus_access_token_adapter_virtual.c | 14 ++ .../include/softbus_access_token_adapter.h | 2 + core/common/include/softbus_def.h | 2 + core/frame/small/init/src/trans_server_stub.c | 44 ++++--- .../standard/init/src/softbus_server_stub.cpp | 112 ++++++++++++---- .../common/include/trans_split_serviceid.h | 38 ++++++ .../common/src/trans_split_serviceid.c | 64 ++++++++++ core/transmission/common/trans_common.gni | 1 + .../include/softbus_message_open_channel.h | 1 - .../manager/src/trans_channel_manager.c | 1 + .../tcp_direct/src/trans_tcp_direct_message.c | 1 + .../src/trans_udp_negotiation.c | 7 +- .../sdk/client_trans_session_manager_struct.h | 1 + interfaces/kits/transport/socket.h | 48 +++++++ interfaces/kits/transport/trans_type.h | 7 + .../include/client_trans_session_manager.h | 4 + .../src/client_trans_session_callback.c | 77 ++++++++++- .../src/client_trans_session_manager.c | 53 ++++++++ .../src/client_trans_session_service.c | 1 + .../session/src/client_trans_socket_manager.c | 1 + .../session/src/client_trans_socket_service.c | 120 ++++++++++++++++++ .../fuzztest/socket_fuzzer/socket_fuzzer.cpp | 30 ++++- .../client_trans_socket_service_test.cpp | 56 ++++++++ .../mock/include/trans_session_mgr_mock.h | 8 ++ .../mock/src/trans_session_mgr_mock.cpp | 13 ++ 26 files changed, 684 insertions(+), 56 deletions(-) create mode 100644 core/transmission/common/include/trans_split_serviceid.h create mode 100644 core/transmission/common/src/trans_split_serviceid.c diff --git a/adapter/common/security/access_token/common/softbus_access_token_adapter.cpp b/adapter/common/security/access_token/common/softbus_access_token_adapter.cpp index 4b1f35f0ce..1f1f7fb006 100644 --- a/adapter/common/security/access_token/common/softbus_access_token_adapter.cpp +++ b/adapter/common/security/access_token/common/softbus_access_token_adapter.cpp @@ -34,8 +34,11 @@ const char *DMS_PROCESS_NAME = "distributedsched"; const std::string DEVICE_KEY_SA_PROCESS_NAME[DEVICE_KEY_SA_CNT] = { "distributedsched", "distributedfiledaemon", "distributeddata" }; #define DMS_COLLABATION_NAME_PREFIX "ohos.dtbcollab.dms" -#define DBINDER_BUS_NAME_PREFIX "DBinder" +#define DBINDER_BUS_NAME_PREFIX "DBinder" #define OBJECT_STORE_DB_NAME_PREFIX "objectstoreDB" +#define SAMGR_UID 5555 +#define DMS_UID 5522 +#define OBJECT_STORE_UID 3012 static PermissionChangeCb g_permissionChangeCb = nullptr; @@ -63,6 +66,14 @@ bool SoftBusCheckIsSystemService(uint64_t tokenId) return type == ATokenTypeEnum::TOKEN_NATIVE; } +bool SoftBusCheckIsSystemAppByUid(uint64_t tokenId, pid_t uid) +{ + if (uid == SAMGR_UID || uid == DMS_UID || uid == OBJECT_STORE_UID) { + return false; + } + return TokenIdKit::IsSystemAppByFullTokenID(tokenId); +} + bool SoftBusCheckIsSystemApp(uint64_t tokenId, const char *sessionName) { if (sessionName == nullptr) { @@ -88,6 +99,27 @@ bool SoftBusCheckIsSystemApp(uint64_t tokenId, const char *sessionName) return TokenIdKit::IsSystemAppByFullTokenID(tokenId); } +bool SoftBusCheckIsNormalAppByUid(uint64_t fullTokenId, pid_t uid) +{ + // The authorization of dbind and dtbcollab are granted through Samgr and DMS, and there is no control here + if (uid == SAMGR_UID || uid == DMS_UID) { + return false; + } + + auto tokenType = AccessTokenKit::GetTokenTypeFlag((AccessTokenID)fullTokenId); + if (tokenType == ATokenTypeEnum::TOKEN_NATIVE) { + return false; + } else if (tokenType == ATokenTypeEnum::TOKEN_HAP) { + bool isSystemApp = TokenIdKit::IsSystemAppByFullTokenID(fullTokenId); + if (isSystemApp) { + return false; + } + COMM_LOGI(COMM_ADAPTER, "The caller is a normal app"); + return true; + } + return false; +} + bool SoftBusCheckIsNormalApp(uint64_t fullTokenId, const char *sessionName) { if (sessionName == nullptr) { diff --git a/adapter/common/security/access_token/common/softbus_access_token_adapter_virtual.c b/adapter/common/security/access_token/common/softbus_access_token_adapter_virtual.c index 5f01762529..039f4e20ea 100644 --- a/adapter/common/security/access_token/common/softbus_access_token_adapter_virtual.c +++ b/adapter/common/security/access_token/common/softbus_access_token_adapter_virtual.c @@ -23,6 +23,13 @@ bool SoftBusCheckIsSystemService(uint64_t tokenId) return false; } +bool SoftBusCheckIsNormalAppByUid(uint64_t fullTokenId, pid_t uid) +{ + (void)fullTokenId; + (void)uid; + return false; +} + bool SoftBusCheckIsNormalApp(uint64_t fullTokenId, const char *sessionName) { (void)fullTokenId; @@ -114,4 +121,11 @@ bool SoftBusCheckIsSystemApp(uint64_t tokenId, const char *sessionName) (void)tokenId; (void)sessionName; return false; +} + +bool SoftBusCheckIsSystemAppByUid(uint64_t tokenId, pid_t uid) +{ + (void)tokenId; + (void)uid; + return false; } \ No newline at end of file diff --git a/adapter/common/security/access_token/include/softbus_access_token_adapter.h b/adapter/common/security/access_token/include/softbus_access_token_adapter.h index c3e634553e..fdf8ae7d73 100644 --- a/adapter/common/security/access_token/include/softbus_access_token_adapter.h +++ b/adapter/common/security/access_token/include/softbus_access_token_adapter.h @@ -37,6 +37,7 @@ typedef enum { } SoftBusAccessTokenType; bool SoftBusCheckIsSystemService(uint64_t tokenId); +bool SoftBusCheckIsNormalAppByUid(uint64_t fullTokenId, pid_t uid); bool SoftBusCheckIsNormalApp(uint64_t fullTokenId, const char *sessionName); bool SoftBusCheckIsAccessAndRecordAccessToken(uint64_t tokenId, const char *permission); int32_t SoftBusCalcPermType(uint64_t fullTokenId, pid_t uid, pid_t pid); @@ -51,6 +52,7 @@ int32_t SoftBusCheckDmsServerPermission(uint64_t tokenId); bool SoftBusCheckIsCollabApp(uint64_t fullTokenId, const char *sessionName); bool SoftBusCheckIsAccess(void); bool SoftBusSaCanUseDeviceKey(uint64_t tokenId); +bool SoftBusCheckIsSystemAppByUid(uint64_t tokenId, pid_t uid); bool SoftBusCheckIsSystemApp(uint64_t tokenId, const char *sessionName); #ifdef __cplusplus #if __cplusplus diff --git a/core/common/include/softbus_def.h b/core/common/include/softbus_def.h index df56665b31..3568e0293c 100644 --- a/core/common/include/softbus_def.h +++ b/core/common/include/softbus_def.h @@ -232,6 +232,8 @@ typedef struct { bool isLowLatency; ProtocolType fdProtocol; char *pkgName; + int64_t serviceId; + int64_t peerServiceId; } ChannelInfo; #ifdef __cplusplus diff --git a/core/frame/small/init/src/trans_server_stub.c b/core/frame/small/init/src/trans_server_stub.c index cb3427ad62..ce1c4e5ebe 100644 --- a/core/frame/small/init/src/trans_server_stub.c +++ b/core/frame/small/init/src/trans_server_stub.c @@ -29,6 +29,7 @@ #include "trans_log.h" #include "trans_session_manager.h" #include "trans_session_service.h" +#include "trans_split_serviceid.h" int32_t ServerCreateSessionServer(IpcIo *req, IpcIo *reply) { @@ -50,10 +51,12 @@ int32_t ServerCreateSessionServer(IpcIo *req, IpcIo *reply) } int32_t callingUid = GetCallingUid(); int32_t callingPid = GetCallingPid(); - if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) { - TRANS_LOGE(TRANS_CTRL, "no permission"); - WriteInt32(reply, SOFTBUS_PERMISSION_DENIED); - return SOFTBUS_PERMISSION_DENIED; + if (!CheckNameContainServiceId(sessionName)) { + if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) { + TRANS_LOGE(TRANS_CTRL, "no permission"); + WriteInt32(reply, SOFTBUS_PERMISSION_DENIED); + return SOFTBUS_PERMISSION_DENIED; + } } int32_t ret = TransCreateSessionServer(pkgName, sessionName, callingUid, callingPid); (void)WriteInt32(reply, ret); @@ -78,12 +81,14 @@ int32_t ServerRemoveSessionServer(IpcIo *req, IpcIo *reply) TRANS_LOGE(TRANS_CTRL, "ServerRemoveSessionServer sessionName is null"); return SOFTBUS_IPC_ERR; } - int32_t callingUid = GetCallingUid(); - int32_t callingPid = GetCallingPid(); - if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) { - TRANS_LOGE(TRANS_CTRL, "no permission"); - WriteInt32(reply, SOFTBUS_PERMISSION_DENIED); - return SOFTBUS_PERMISSION_DENIED; + if (!CheckNameContainServiceId(sessionName)) { + int32_t callingUid = GetCallingUid(); + int32_t callingPid = GetCallingPid(); + if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) { + TRANS_LOGE(TRANS_CTRL, "no permission"); + WriteInt32(reply, SOFTBUS_PERMISSION_DENIED); + return SOFTBUS_PERMISSION_DENIED; + } } int32_t ret = TransRemoveSessionServer(pkgName, sessionName); WriteInt32(reply, ret); @@ -228,17 +233,18 @@ int32_t ServerOpenSession(IpcIo *req, IpcIo *reply) return SOFTBUS_IPC_ERR; } - ret = CheckOpenSessionPremission(param.sessionName, param.peerSessionName); - if (ret != SOFTBUS_OK) { - transSerializer.ret = ret; - WriteUint32(reply, sizeof(TransSerializer)); - bool value = WriteBuffer(reply, (void *)&transSerializer, sizeof(TransSerializer)); - if (!value) { - return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED; + if (!CheckNameContainServiceId(param.sessionName)) { + ret = CheckOpenSessionPremission(param.sessionName, param.peerSessionName); + if (ret != SOFTBUS_OK) { + transSerializer.ret = ret; + WriteUint32(reply, sizeof(TransSerializer)); + bool value = WriteBuffer(reply, (void *)&transSerializer, sizeof(TransSerializer)); + if (!value) { + return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED; + } + return ret; } - return ret; } - ret = TransOpenSession(¶m, &(transSerializer.transInfo)); transSerializer.ret = ret; WriteUint32(reply, sizeof(TransSerializer)); diff --git a/core/frame/standard/init/src/softbus_server_stub.cpp b/core/frame/standard/init/src/softbus_server_stub.cpp index 96e81ddb0e..9fd06be403 100644 --- a/core/frame/standard/init/src/softbus_server_stub.cpp +++ b/core/frame/standard/init/src/softbus_server_stub.cpp @@ -31,6 +31,7 @@ #include "trans_log.h" #include "trans_network_statistics.h" #include "trans_session_manager.h" +#include "trans_split_serviceid.h" #ifdef SUPPORT_BUNDLENAME #include "bundle_mgr_proxy.h" @@ -405,10 +406,18 @@ static int32_t GetAppId(const std::string &bundleName, std::string &appId) return SOFTBUS_OK; } +static bool CheckSystemAppSessionName(const char *sessionName, pid_t callingUid, uint64_t callingFullTokenId) +{ + return CheckNameContainServiceId(sessionName) ? SoftBusCheckIsSystemAppByUid(callingFullTokenId, callingUid) : + SoftBusCheckIsSystemApp(callingFullTokenId, sessionName); +} + static int32_t CheckNormalAppSessionName( const char *sessionName, pid_t callingUid, std::string &strName, uint64_t callingFullTokenId) { - if (SoftBusCheckIsNormalApp(callingFullTokenId, sessionName)) { + bool ret = CheckNameContainServiceId(sessionName) ? SoftBusCheckIsNormalAppByUid(callingFullTokenId, callingUid) : + SoftBusCheckIsNormalApp(callingFullTokenId, sessionName); + if (ret) { std::string bundleName; int32_t result = GetBundleName(callingUid, bundleName); if (result != SOFTBUS_OK) { @@ -472,12 +481,40 @@ static int32_t SoftBusCheckTimestamp(MessageParcel &data, const char *sessionNam return SOFTBUS_TRANS_SESSION_TIME_NOT_EQUAL; } +static bool CheckPkgPidUidServiceId(const char *pkgName, pid_t callingPid, pid_t callingUid) +{ +#define PKG "pkg_" +#define PKG_LENGHT 4 +#define GET_UID_PID_CNT 2 + if (pkgName == NULL) { + return false; + } + if (strlen(pkgName) <= PKG_LENGHT) { + return false; + } + if (strncmp(pkgName, PKG, PKG_LENGHT) != 0) { + return false; + } + + int64_t pid = -1; + int64_t uid = -1; + if (sscanf_s(pkgName, "%" SCNd64 "_%" SCNd64, &pid, &uid) != GET_UID_PID_CNT) { + return false; + } + + if ((pid_t)pid == callingPid && (pid_t)uid == callingUid) { + return true; + } + + return false; +} + int32_t SoftBusServerStub::CreateSessionServerInner(MessageParcel &data, MessageParcel &reply) { COMM_LOGD(COMM_SVC, "enter"); int32_t retReply; - pid_t callingUid; - pid_t callingPid; + pid_t callingUid = OHOS::IPCSkeleton::GetCallingUid(); + pid_t callingPid = OHOS::IPCSkeleton::GetCallingPid(); #ifdef SUPPORT_BUNDLENAME uint64_t callingFullTokenId = IPCSkeleton::GetCallingFullTokenID(); #endif @@ -496,14 +533,19 @@ int32_t SoftBusServerStub::CreateSessionServerInner(MessageParcel &data, Message goto EXIT; } strName = sessionName; - callingUid = OHOS::IPCSkeleton::GetCallingUid(); - callingPid = OHOS::IPCSkeleton::GetCallingPid(); - if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) { - retReply = SOFTBUS_PERMISSION_DENIED; - goto EXIT; + if (CheckNameContainServiceId(sessionName)) { + if (!CheckPkgPidUidServiceId(pkgName, callingPid, callingUid)) { + retReply = SOFTBUS_PERMISSION_DENIED; + goto EXIT; + } + } else { + if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) { + retReply = SOFTBUS_PERMISSION_DENIED; + goto EXIT; + } } #ifdef SUPPORT_BUNDLENAME - if (SoftBusCheckIsSystemApp(callingFullTokenId, sessionName) == true) { + if (CheckSystemAppSessionName(sessionName, callingUid, callingFullTokenId)) { if (TransCheckSystemAppList(callingUid) != SOFTBUS_OK) { retReply = SOFTBUS_PERMISSION_DENIED; goto EXIT; @@ -545,13 +587,14 @@ int32_t SoftBusServerStub::RemoveSessionServerInner(MessageParcel &data, Message retReply = SOFTBUS_TRANS_PROXY_READCSTRING_FAILED; goto EXIT; } - callingUid = OHOS::IPCSkeleton::GetCallingUid(); callingPid = OHOS::IPCSkeleton::GetCallingPid(); - if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) { - COMM_LOGE(COMM_SVC, "RemoveSessionServerInner check perm failed"); - retReply = SOFTBUS_PERMISSION_DENIED; - goto EXIT; + if (!CheckNameContainServiceId(sessionName)) { + if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) { + COMM_LOGE(COMM_SVC, "RemoveSessionServerInner check perm failed"); + retReply = SOFTBUS_PERMISSION_DENIED; + goto EXIT; + } } if (!CheckUidAndPid(sessionName, callingUid, callingPid)) { @@ -666,17 +709,45 @@ int32_t SoftBusServerStub::OpenSessionInner(MessageParcel &data, MessageParcel & int64_t timeStart = 0; int64_t timediff = 0; SoftBusOpenSessionStatus isSucc = SOFTBUS_EVT_OPEN_SESSION_FAIL; + char networkId[NETWORK_ID_BUF_LEN] = { 0 }; ReadSessionInfo(data, param); ReadSessionAttrs(data, &getAttr); param.attr = &getAttr; COMM_CHECK_AND_RETURN_RET_LOGE(ReadQosInfo(data, param), SOFTBUS_IPC_ERR, COMM_SVC, "failed to read qos info"); - if (param.sessionName == nullptr || param.peerSessionName == nullptr || param.peerDeviceId == nullptr || param.groupId == nullptr) { retReply = SOFTBUS_INVALID_PARAM; goto EXIT; } - + if (CheckNameContainServiceId(param.sessionName)) { + if (LnnGetNetworkIdByUuid(param.peerDeviceId, networkId, sizeof(networkId)) != SOFTBUS_OK) { + COMM_LOGE(COMM_SVC, "get networkId by uuid fail"); + return SOFTBUS_INVALID_PARAM; + goto EXIT; + } + param.peerDeviceId = networkId; + if ((retReply = TransCheckClientAccessControl(param.peerDeviceId)) != SOFTBUS_OK) { + goto EXIT; + } + if (!CheckUidAndPid( + param.sessionName, OHOS::IPCSkeleton::GetCallingUid(), OHOS::IPCSkeleton::GetCallingPid())) { + char *tmpName = NULL; + Anonymize(param.sessionName, &tmpName); + COMM_LOGE(COMM_SVC, "Check Uid and Pid failed, sessionName=%{public}s", AnonymizeWrapper(tmpName)); + AnonymizeFree(tmpName); + retReply = SOFTBUS_TRANS_CHECK_PID_ERROR; + goto EXIT; + } + } else { + if ((retReply = TransCheckClientAccessControl(param.peerDeviceId)) != SOFTBUS_OK) { + goto EXIT; + } + if (CheckOpenSessionPermission(¶m) != SOFTBUS_OK) { + SoftbusReportTransErrorEvt(SOFTBUS_PERMISSION_DENIED); + retReply = SOFTBUS_PERMISSION_DENIED; + goto EXIT; + } + } #define DMS_COLLABATION_NAME_PREFIX "ohos.dtbcollab.dms" if (strncmp(param.sessionName, DMS_COLLABATION_NAME_PREFIX, strlen(DMS_COLLABATION_NAME_PREFIX)) == 0) { COMM_LOGI(COMM_SVC, "DMS bind request, need check collaboration relationship"); @@ -688,15 +759,6 @@ int32_t SoftBusServerStub::OpenSessionInner(MessageParcel &data, MessageParcel & } } - if ((retReply = TransCheckClientAccessControl(param.peerDeviceId)) != SOFTBUS_OK) { - goto EXIT; - } - if (CheckOpenSessionPermission(¶m) != SOFTBUS_OK) { - SoftbusReportTransErrorEvt(SOFTBUS_PERMISSION_DENIED); - retReply = SOFTBUS_PERMISSION_DENIED; - goto EXIT; - } - timeStart = GetSoftbusRecordTimeMillis(); retReply = OpenSession(¶m, &(transSerializer.transInfo)); timediff = GetSoftbusRecordTimeMillis() - timeStart; diff --git a/core/transmission/common/include/trans_split_serviceid.h b/core/transmission/common/include/trans_split_serviceid.h new file mode 100644 index 0000000000..c98fe1bd98 --- /dev/null +++ b/core/transmission/common/include/trans_split_serviceid.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2025 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 TRANS_SPLIT_SERVICEID_H +#define TRANS_SPLIT_SERVICEID_H + +#include "securec.h" +#include +#include + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif + +int64_t SplitToGetServiceId(const char *str); +bool CheckNameContainServiceId(const char *str); + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif // TRANS_SPLIT_SERVICEID_H \ No newline at end of file diff --git a/core/transmission/common/src/trans_split_serviceid.c b/core/transmission/common/src/trans_split_serviceid.c new file mode 100644 index 0000000000..d58e35d024 --- /dev/null +++ b/core/transmission/common/src/trans_split_serviceid.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2025 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 "string.h" + +#include "softbus_error_code.h" +#include "softbus_utils.h" +#include "trans_split_serviceid.h" + +#define TARGET "serviceId" +#define TARGET_LENGHT 9 +#define STR_SIZE_MAX 31 + +int64_t SplitToGetServiceId(const char *str) +{ + if (str == NULL || strlen(str) > STR_SIZE_MAX) { + return SOFTBUS_INVALID_PARAM; + } + + const char *underscore = strchr(str, '_'); + if (underscore == NULL) { + return SOFTBUS_INVALID_PARAM; + } + const char *substring = underscore + 1; + char *endptr; + int64_t value = (int64_t)strtoll(substring, &endptr, 10); + if ((value == INT64_MAX || value == INT64_MIN) && errno == ERANGE) { + return SOFTBUS_INVALID_PARAM; + } + + if (endptr == substring || *endptr != '\0') { + return SOFTBUS_INVALID_PARAM; + } + return value; +} + +bool CheckNameContainServiceId(const char *str) +{ + if (str == NULL || strlen(str) > STR_SIZE_MAX) { + return false; + } + + const char *underscore = strchr(str, '_'); + if (underscore == NULL) { + return false; + } + size_t length = underscore - str; + if (length != TARGET_LENGHT) { + return false; + } + return strncmp(str, TARGET, TARGET_LENGHT) == 0; +} \ No newline at end of file diff --git a/core/transmission/common/trans_common.gni b/core/transmission/common/trans_common.gni index cbb1b56d44..d226a5290f 100644 --- a/core/transmission/common/trans_common.gni +++ b/core/transmission/common/trans_common.gni @@ -22,6 +22,7 @@ trans_common_src = [ "$dsoftbus_root_path/core/transmission/common/src/trans_assemble_tlv.c", "$dsoftbus_root_path/core/transmission/common/src/trans_pending_pkt.c", "$dsoftbus_root_path/core/transmission/common/src/trans_proxy_process_data.c", + "$dsoftbus_root_path/core/transmission/common/src/trans_split_serviceid.c", "$dsoftbus_root_path/core/transmission/common/src/trans_tcp_process_data.c", ] diff --git a/core/transmission/trans_channel/common/include/softbus_message_open_channel.h b/core/transmission/trans_channel/common/include/softbus_message_open_channel.h index 979f232003..791bba5156 100644 --- a/core/transmission/trans_channel/common/include/softbus_message_open_channel.h +++ b/core/transmission/trans_channel/common/include/softbus_message_open_channel.h @@ -50,7 +50,6 @@ #define SINK_ACL_ACCOUNT_ID "SINK_ACL_ACCOUNT_ID" #define SINK_ACL_USER_ID "SINK_ACL_USER_ID" #define SINK_ACL_TOKEN_ID "SINK_ACL_TOKEN_ID" - #define TRANS_CAPABILITY "TRANS_CAPABILITY" #ifdef __cplusplus diff --git a/core/transmission/trans_channel/manager/src/trans_channel_manager.c b/core/transmission/trans_channel/manager/src/trans_channel_manager.c index d701e666a8..381528aaa5 100644 --- a/core/transmission/trans_channel/manager/src/trans_channel_manager.c +++ b/core/transmission/trans_channel/manager/src/trans_channel_manager.c @@ -53,6 +53,7 @@ #include "trans_log.h" #include "trans_network_statistics.h" #include "trans_session_manager.h" +#include "trans_split_serviceid.h" #include "trans_tcp_direct_manager.h" #include "trans_tcp_direct_message.h" #include "trans_tcp_direct_sessionconn.h" 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 221b893097..f24728cd31 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 @@ -52,6 +52,7 @@ #include "trans_lane_manager.h" #include "trans_log.h" #include "trans_session_manager.h" +#include "trans_split_serviceid.h" #include "trans_tcp_direct_callback.h" #include "trans_tcp_direct_listener.h" #include "trans_tcp_direct_manager.h" diff --git a/core/transmission/trans_channel/udp_negotiation/src/trans_udp_negotiation.c b/core/transmission/trans_channel/udp_negotiation/src/trans_udp_negotiation.c index 9b6bd432bc..4baf7f9eec 100644 --- a/core/transmission/trans_channel/udp_negotiation/src/trans_udp_negotiation.c +++ b/core/transmission/trans_channel/udp_negotiation/src/trans_udp_negotiation.c @@ -42,6 +42,7 @@ #include "trans_lane_pending_ctl.h" #include "trans_log.h" #include "trans_session_manager.h" +#include "trans_split_serviceid.h" #include "trans_udp_channel_manager.h" #include "trans_udp_negotiation_exchange.h" #include "trans_uk_manager.h" @@ -633,8 +634,10 @@ static int32_t ParseRequestAppInfo(AuthHandle authHandle, const cJSON *msg, AppI } } - if (CheckSecLevelPublic(appInfo->myData.sessionName, appInfo->peerData.sessionName) != SOFTBUS_OK) { - return SOFTBUS_PERMISSION_SERVER_DENIED; + if (!CheckNameContainServiceId(appInfo->myData.sessionName)) { + if (CheckSecLevelPublic(appInfo->myData.sessionName, appInfo->peerData.sessionName) != SOFTBUS_OK) { + return SOFTBUS_PERMISSION_SERVER_DENIED; + } } if (appInfo->udpChannelOptType != TYPE_UDP_CHANNEL_OPEN) { diff --git a/interfaces/kits/sdk/client_trans_session_manager_struct.h b/interfaces/kits/sdk/client_trans_session_manager_struct.h index e5d7fb2c5e..d659c3f15a 100644 --- a/interfaces/kits/sdk/client_trans_session_manager_struct.h +++ b/interfaces/kits/sdk/client_trans_session_manager_struct.h @@ -140,6 +140,7 @@ typedef struct { bool permissionState; bool isSrvEncryptedRawStream; int32_t sessionAddingCnt; + int64_t serviceId; } ClientSessionServer; typedef enum { diff --git a/interfaces/kits/transport/socket.h b/interfaces/kits/transport/socket.h index 44bc51fae3..f8e1cddc62 100644 --- a/interfaces/kits/transport/socket.h +++ b/interfaces/kits/transport/socket.h @@ -197,6 +197,39 @@ typedef struct { */ bool (*OnNegotiate)(int32_t socket, PeerSocketInfo info); + /** + * @brief Called when a socket is bind. + * + * This callback is invoked to verify the socket or initialize resources related to the socket. + * When the connection is successful, this callback be called on the server side. + * The server side refers to the side that called {@Listen} function. + * + * When a socket is async bind, client side need implement this interface. + * + * @param socket Indicates the unique socket fd. + * @param info Indicates the information of peer service socket. + * @since 2.0 + * @version 2.0 + */ + void (*OnServiceBind)(int32_t socket, ServiceSocketInfo info); + + /** + * @brief Called when a socket is negotiating. + * + * This callback is invoked to negotiating the socket, this callback be called on the server side. + * The server can determine whether to bind the socket based on the negotiation result. + * + * + * @param socket Indicates the unique socket fd. + * @param info Indicates the information of peer service socket. + * @return If true is returned, it indicates that the negotiation is successful. If this method is not implemented, + * the negotiation is successful by default. if false is returned, the negotiation fails and the client is notified + * that the connection is rejected. + * @since 2.0 + * @version 2.0 + */ + bool (*OnServiceNegotiate)(int32_t socket, ServiceSocketInfo info); + /** * @brief Registration during Bind link establishment. * @@ -240,6 +273,21 @@ typedef struct { void (*OnMessageSent)(int32_t socket, uint16_t dataSeq, int32_t errCode); } ISocketListener; +/** + * @brief Creates a service socket. + * + * A maximum of 15 socket can be created. + * + * @param info Indicates the description of the socket structure. + * It is the unique identifier of the upper-layer service. The value cannot be empty or exceed 64 characters. + * + * @return Returns socket fd if the socket creation is successful; + * returns an error code less than zero otherwise. + * @since 2.0 + * @version 2.0 + */ +int32_t ServiceSocket(ServiceSocketInfo info); + /** * @brief Creates a socket. * diff --git a/interfaces/kits/transport/trans_type.h b/interfaces/kits/transport/trans_type.h index 24ebdde7e6..22aed061e7 100644 --- a/interfaces/kits/transport/trans_type.h +++ b/interfaces/kits/transport/trans_type.h @@ -47,6 +47,13 @@ typedef enum { DATA_TYPE_BUTT, } TransDataType; +typedef struct { + char *peerNetworkId; /**< Peer network ID, maximum length 64 bytes */ + int64_t serviceId; /**< My service id */ + int64_t peerServiceId; /**< Peer service id */ + TransDataType dataType; /**< Data type */ +} ServiceSocketInfo; + typedef enum { EVENT_TYPE_CHANNEL_OPENED, EVENT_TYPE_TRANS_LIMIT_CHANGE, diff --git a/sdk/transmission/session/include/client_trans_session_manager.h b/sdk/transmission/session/include/client_trans_session_manager.h index 6b5f141ff2..842c176695 100644 --- a/sdk/transmission/session/include/client_trans_session_manager.h +++ b/sdk/transmission/session/include/client_trans_session_manager.h @@ -112,6 +112,10 @@ int32_t ClientGetSessionCallbackAdapterByName(const char *sessionName, SessionLi int32_t ClientGetSessionCallbackAdapterById(int32_t sessionId, SessionListenerAdapter *callbackAdapter, bool *isServer); +int32_t ClientGetServiceSocketInfoById(int32_t socket, ServiceSocketInfo *socketInfo); + +bool IsContainServiceBySocket(int32_t socket); + int32_t ClientGetPeerSocketInfoById(int32_t sessionId, PeerSocketInfo *peerSocketInfo); bool IsSessionExceedLimit(void); diff --git a/sdk/transmission/session/src/client_trans_session_callback.c b/sdk/transmission/session/src/client_trans_session_callback.c index 014a1c88af..a6afe48f1f 100644 --- a/sdk/transmission/session/src/client_trans_session_callback.c +++ b/sdk/transmission/session/src/client_trans_session_callback.c @@ -29,6 +29,7 @@ #include "softbus_def.h" #include "softbus_error_code.h" #include "trans_log.h" +#include "trans_split_serviceid.h" #define RETRY_GET_INFO_TIMES_MS 300 @@ -211,6 +212,24 @@ NO_SANITIZE("cfi") static int32_t TransOnBindSuccess(int32_t sessionId, const IS return SOFTBUS_OK; } +NO_SANITIZE("cfi") static int32_t TransOnServiceBindSuccess(int32_t sessionId, const ISocketListener *socketCallback) +{ + if (socketCallback == NULL || socketCallback->OnServiceBind == NULL) { + TRANS_LOGE(TRANS_SDK, "Invalid OnServiceBind callback function"); + return SOFTBUS_INVALID_PARAM; + } + + ServiceSocketInfo info; + int32_t ret = ClientGetServiceSocketInfoById(sessionId, &info); + if (ret != SOFTBUS_OK) { + TRANS_LOGE(TRANS_SDK, "Get service socket info failed, ret=%{public}d", ret); + return ret; + } + + socketCallback->OnServiceBind(sessionId, info); + return SOFTBUS_OK; +} + NO_SANITIZE("cfi") static int32_t TransOnBindFailed(int32_t sessionId, const ISocketListener *socketCallback, int32_t errCode) { @@ -263,7 +282,11 @@ static int32_t HandleAsyncBindSuccess( return ret; } - return TransOnBindSuccess(sessionId, socketClient); + bool isContain = IsContainServiceBySocket(sessionId); + if (!isContain) { + return TransOnBindSuccess(sessionId, socketClient); + } + return TransOnServiceBindSuccess(sessionId, socketClient); } NO_SANITIZE("cfi") static int32_t TransOnNegotiate(int32_t socket, const ISocketListener *socketCallback) @@ -333,12 +356,41 @@ static int32_t TransOnNegotiate2(int32_t socket, const ISocketListener *socketCa return SOFTBUS_OK; } +NO_SANITIZE("cfi") static int32_t TransOnServiceNegotiate(int32_t socket, const ISocketListener *socketCallback) +{ + if (socketCallback == NULL) { + TRANS_LOGE(TRANS_SDK, "Invalid socketCallback socket=%{public}d", socket); + return SOFTBUS_INVALID_PARAM; + } + + if (socketCallback->OnServiceNegotiate == NULL) { + TRANS_LOGW(TRANS_SDK, "no OnServiceNegotiate callback function socket=%{public}d", socket); + return SOFTBUS_OK; + } + + ServiceSocketInfo info = {0}; + int32_t ret = ClientGetServiceSocketInfoById(socket, &info); + if (ret != SOFTBUS_OK) { + TRANS_LOGE(TRANS_SDK, "Get service socket info failed, ret=%{public}d, socket=%{public}d", ret, socket); + return ret; + } + + if (!socketCallback->OnServiceNegotiate(socket, info)) { + TRANS_LOGW(TRANS_SDK, "The negotiate rejected the socket=%{public}d", socket); + return SOFTBUS_TRANS_NEGOTIATE_REJECTED; + } + + return SOFTBUS_OK; +} + static int32_t HandleServerOnNegotiate(int32_t socket, int32_t tokenType, const ISocketListener *socketCallback, const ChannelInfo *channel, SocketAccessInfo *localAccessInfo) { - int32_t ret = TransOnNegotiate(socket, socketCallback); + bool isContain = IsContainServiceBySocket(socket); + int32_t ret = + isContain ? TransOnServiceNegotiate(socket, socketCallback) : TransOnNegotiate(socket, socketCallback); if (ret != SOFTBUS_OK) { - TRANS_LOGE(TRANS_SDK, "TransOnNegotiate failed, ret=%{public}d", ret); + TRANS_LOGE(TRANS_SDK, "TransOn%{public}sNegotiate failed, ret=%{public}d", isContain ? "Service" : "", ret); (void)ClientDeleteSocketSession(socket); return ret; } @@ -784,11 +836,26 @@ int32_t ClientTransOnChannelBind(int32_t channelId, int32_t channelType) } ISocketListener *listener = &sessionCallback.socketServer; - ret = TransOnBindSuccess(socket, listener); + char sessionName[SESSION_NAME_SIZE_MAX + 1] = { 0 }; + ret = ClientGetSessionNameByChannelId(channelId, channelType, sessionName, SESSION_NAME_SIZE_MAX); if (ret != SOFTBUS_OK) { - TRANS_LOGE(TRANS_SDK, "client on bind failed channelId=%{public}d", channelId); + TRANS_LOGE(TRANS_FILE, "failed to get sessionName, channelId=%{public}d", channelId); return ret; } + bool isContained = CheckNameContainServiceId(sessionName); + if (!isContained) { + ret = TransOnBindSuccess(socket, listener); + if (ret != SOFTBUS_OK) { + TRANS_LOGE(TRANS_SDK, "client on bind failed channelId=%{public}d", channelId); + return ret; + } + } else { + ret = TransOnServiceBindSuccess(socket, listener); + if (ret != SOFTBUS_OK) { + TRANS_LOGE(TRANS_SDK, "client on service bind failed channelId=%{public}d", channelId); + return ret; + } + } TRANS_LOGI(TRANS_SDK, "ok, channelId=%{public}d", channelId); return SOFTBUS_OK; } diff --git a/sdk/transmission/session/src/client_trans_session_manager.c b/sdk/transmission/session/src/client_trans_session_manager.c index 888b9a82c5..048bcdb933 100644 --- a/sdk/transmission/session/src/client_trans_session_manager.c +++ b/sdk/transmission/session/src/client_trans_session_manager.c @@ -37,6 +37,7 @@ #include "softbus_utils.h" #include "trans_log.h" #include "trans_server_proxy.h" +#include "trans_split_serviceid.h" #define CONVERSION_BASE 1000LL #define CAST_SESSION "CastPlusSessionName" @@ -507,6 +508,30 @@ static int32_t GetSessionById(int32_t sessionId, ClientSessionServer **server, S return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND; } +bool IsContainServiceBySocket(int32_t socket) +{ + if (socket <= 0) { + TRANS_LOGE(TRANS_SDK, "Invalid param"); + return false; + } + + if (LockClientSessionServerList() != SOFTBUS_OK) { + TRANS_LOGE(TRANS_SDK, "lock failed"); + return false; + } + + ClientSessionServer *serverNode = NULL; + SessionInfo *sessionNode = NULL; + if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) { + UnlockClientSessionServerList(); + TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket); + return false; + } + bool isContain = CheckNameContainServiceId(serverNode->sessionName); + UnlockClientSessionServerList(); + return isContain; +} + static int32_t GetSessionByChannelId(int32_t channelId, int32_t channelType, ClientSessionServer **server, SessionInfo **session) { @@ -2330,6 +2355,34 @@ int32_t ClientGetPeerSocketInfoById(int32_t socket, PeerSocketInfo *peerSocketIn return SOFTBUS_OK; } +int32_t ClientGetServiceSocketInfoById(int32_t socket, ServiceSocketInfo *socketInfo) +{ + if (socket <= 0 || socketInfo == NULL) { + TRANS_LOGE(TRANS_SDK, "Invalid param"); + return SOFTBUS_INVALID_PARAM; + } + + int32_t ret = LockClientSessionServerList(); + if (ret != SOFTBUS_OK) { + TRANS_LOGE(TRANS_SDK, "lock failed"); + return ret; + } + + ClientSessionServer *serverNode = NULL; + SessionInfo *sessionNode = NULL; + if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) { + UnlockClientSessionServerList(); + TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket); + return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND; + } + + socketInfo->serviceId = SplitToGetServiceId(serverNode->sessionName); + socketInfo->peerServiceId = SplitToGetServiceId(sessionNode->info.peerSessionName); + socketInfo->dataType = (TransDataType)sessionNode->info.flag; + UnlockClientSessionServerList(); + return SOFTBUS_OK; +} + bool IsSessionExceedLimit(void) { if (LockClientSessionServerList() != SOFTBUS_OK) { diff --git a/sdk/transmission/session/src/client_trans_session_service.c b/sdk/transmission/session/src/client_trans_session_service.c index 02f583f904..ab7ccf48e1 100644 --- a/sdk/transmission/session/src/client_trans_session_service.c +++ b/sdk/transmission/session/src/client_trans_session_service.c @@ -44,6 +44,7 @@ #include "softbus_utils.h" #include "trans_log.h" #include "trans_server_proxy.h" +#include "trans_split_serviceid.h" typedef int (*SessionOptionRead)(int32_t channelId, int32_t type, void* value, uint32_t valueSize); typedef int (*SessionOptionWrite)(int32_t channelId, int32_t type, void* value, uint32_t valueSize); diff --git a/sdk/transmission/session/src/client_trans_socket_manager.c b/sdk/transmission/session/src/client_trans_socket_manager.c index ea62b0a787..20b251a247 100644 --- a/sdk/transmission/session/src/client_trans_socket_manager.c +++ b/sdk/transmission/session/src/client_trans_socket_manager.c @@ -34,6 +34,7 @@ #include "softbus_utils.h" #include "trans_log.h" #include "trans_server_proxy.h" +#include "trans_split_serviceid.h" #define NETWORK_ID_LEN 7 #define GET_ROUTE_TYPE(type) ((uint32_t)(type) & 0xff) diff --git a/sdk/transmission/session/src/client_trans_socket_service.c b/sdk/transmission/session/src/client_trans_socket_service.c index 6a577622ac..39ea3cd1a7 100644 --- a/sdk/transmission/session/src/client_trans_socket_service.c +++ b/sdk/transmission/session/src/client_trans_socket_service.c @@ -15,6 +15,7 @@ #include "string.h" #include +#include #include "anonymizer.h" #include "client_trans_session_adapter.h" @@ -82,6 +83,125 @@ static void PrintSocketInfo(const SocketInfo *info) AnonymizeFree(tmpPkgName); } +static void PrintServiceSocketInfo(const ServiceSocketInfo *serviceInfo, const SocketInfo *info) +{ + if (serviceInfo == NULL || info == NULL) { + return; + } + char *tmpMyName = NULL; + char *tmpPeerName = NULL; + char *tmpPeerNetworkId = NULL; + Anonymize(info->name, &tmpMyName); + Anonymize(info->peerName, &tmpPeerName); + Anonymize(info->peerNetworkId, &tmpPeerNetworkId); + TRANS_LOGI(TRANS_SDK, + "Socket: myServiceId=%{public}" PRId64 ", peerServiceId=%{public}" PRId64 ", " + "mySocketName=%{public}s, peerSocketName=%{public}s, peerNetworkId=%{public}s, pkgName=%{public}s, " + "dataType=%{public}d", + serviceInfo->serviceId, serviceInfo->peerServiceId, AnonymizeWrapper(tmpMyName), AnonymizeWrapper(tmpPeerName), + AnonymizeWrapper(tmpPeerNetworkId), info->pkgName, info->dataType); + AnonymizeFree(tmpMyName); + AnonymizeFree(tmpPeerName); + AnonymizeFree(tmpPeerNetworkId); +} + +static bool SetNameByServiceId(char **dest, const char* name, uint32_t destLen) +{ + *dest = (char *)SoftBusCalloc(destLen * sizeof(char)); + if (*dest == NULL) { + TRANS_LOGE(TRANS_SDK, "SoftBusCalloc failed"); + return false; + } + + if (strcpy_s(*dest, destLen, name) != EOK) { + SoftBusFree(*dest); + *dest = NULL; + TRANS_LOGE(TRANS_SDK, "strcpy_s failed"); + return false; + } + + return true; +} + +static bool GenerateNameByServiceId(SocketInfo *socketInfo, ServiceSocketInfo info) +{ + char pkgName[PKG_NAME_SIZE_MAX]; + int32_t ret = sprintf_s(pkgName, PKG_NAME_SIZE_MAX, "pkg_%d_%d", getpid(), getuid()); + if (ret < 0 || ret >= (int32_t)sizeof(pkgName)) { + TRANS_LOGE(TRANS_SDK, "pkgName err"); + return false; + } + char name[PKG_NAME_SIZE_MAX]; + ret = sprintf_s(name, PKG_NAME_SIZE_MAX, "serviceId_%d", info.serviceId); + if (ret < 0 || ret >= (int32_t)sizeof(name)) { + TRANS_LOGE(TRANS_SDK, "name err"); + return false; + } + char peerName[PKG_NAME_SIZE_MAX]; + ret = sprintf_s(peerName, PKG_NAME_SIZE_MAX, "serviceId_%d", info.peerServiceId); + if (ret < 0 || ret >= (int32_t)sizeof(peerName)) { + TRANS_LOGE(TRANS_SDK, "peerName err"); + return false; + } + + if (!SetNameByServiceId(&socketInfo->pkgName, pkgName, PKG_NAME_SIZE_MAX)) { + return false; + } + + if (!SetNameByServiceId(&socketInfo->name, name, PKG_NAME_SIZE_MAX)) { + SoftBusFree(socketInfo->pkgName); + socketInfo->pkgName = NULL; + return false; + } + + if (!SetNameByServiceId(&socketInfo->peerName, peerName, PKG_NAME_SIZE_MAX)) { + SoftBusFree(socketInfo->name); + socketInfo->name = NULL; + SoftBusFree(socketInfo->pkgName); + socketInfo->pkgName = NULL; + return false; + } + + return true; +} + +int32_t ServiceSocket(ServiceSocketInfo info) +{ + if (info.peerNetworkId == NULL) { + TRANS_LOGW(TRANS_SDK, "invalid SocketInfo"); + return SOFTBUS_INVALID_PARAM; + } + SocketInfo socket; + (void)memset_s(&socket, sizeof(SocketInfo), 0, sizeof(SocketInfo)); + if (!GenerateNameByServiceId(&socket, info)) { + return SOFTBUS_INVALID_PARAM; + } + socket.dataType = info.dataType; + socket.peerNetworkId = info.peerNetworkId; + PrintServiceSocketInfo(&info, &socket); + int32_t ret = CreateSocket(socket.pkgName, socket.name); + int32_t socketFd = INVALID_SESSION_ID; + if (ret != SOFTBUS_OK) { + TRANS_LOGE(TRANS_SDK, "CreateSocket failed, ret=%{public}d.", ret); + goto FREE; + } + TRANS_LOGI(TRANS_SDK, "gererate socketFd start"); + ret = ClientAddSocket(&socket, &socketFd); + if (ret != SOFTBUS_OK) { + TRANS_LOGE(TRANS_SDK, "add socket failed, ret=%{public}d.", ret); + goto FREE; + } + SocketServerStateUpdate(socket.name); + TRANS_LOGD(TRANS_SDK, "create socket ok, socket=%{public}d", socketFd); + ret = socketFd; + +FREE: + SoftBusFree(socket.peerName); + SoftBusFree(socket.name); + SoftBusFree(socket.pkgName); + return ret; +} + int32_t Socket(SocketInfo info) { int32_t ret = CheckSocketInfoIsValid(&info); diff --git a/tests/sdk/transmission/fuzztest/socket_fuzzer/socket_fuzzer.cpp b/tests/sdk/transmission/fuzztest/socket_fuzzer/socket_fuzzer.cpp index ddc73de92d..3cd2d75c3b 100644 --- a/tests/sdk/transmission/fuzztest/socket_fuzzer/socket_fuzzer.cpp +++ b/tests/sdk/transmission/fuzztest/socket_fuzzer/socket_fuzzer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 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 @@ -14,10 +14,12 @@ */ #include "socket_fuzzer.h" +#include "socket.h" +#include #include -#include #include -#include "socket.h" +#include +#include namespace OHOS { static std::string DEFAULT_SOCKET_NAME = "com.communication.fuzz.socketName"; @@ -155,15 +157,37 @@ void SocketTestWithDataType(const uint8_t *data, size_t size) (void)Socket(info); } + +void ServiceSocketTest(FuzzedDataProvider &provider) +{ +#define NETWORK_ID_BUF_LEN 65 + std::string providerNetworkId = provider.ConsumeBytesAsString(NETWORK_ID_BUF_LEN - 1); + char networkId[NETWORK_ID_BUF_LEN] = { 0 }; + if (strcpy_s(networkId, NETWORK_ID_BUF_LEN, providerNetworkId.c_str()) != EOK) { + return; + } + ServiceSocketInfo info = { + .peerNetworkId = const_cast(networkId), + .serviceId = provider.ConsumeIntegral(), + .peerServiceId = provider.ConsumeIntegral(), + .dataType = + static_cast(provider.ConsumeIntegralInRange(DATA_TYPE_MESSAGE, DATA_TYPE_BUTT)), + }; + + (void)ServiceSocket(info); +} } // namespace OHOS /* Fuzzer entry point */ extern "C" int32_t LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + /* Run your code on data */ + FuzzedDataProvider provider(data, size); OHOS::SocketTestWithName(data, size); OHOS::SocketTestWithPeerName(data, size); OHOS::SocketTestWithNetworkId(data, size); OHOS::SocketTestWithPkgName(data, size); OHOS::SocketTestWithDataType(data, size); + OHOS::ServiceSocketTest(provider); return 0; } diff --git a/tests/sdk/transmission/session/client_trans_socket_service_test.cpp b/tests/sdk/transmission/session/client_trans_socket_service_test.cpp index 91321d8d5d..80b7848415 100644 --- a/tests/sdk/transmission/session/client_trans_socket_service_test.cpp +++ b/tests/sdk/transmission/session/client_trans_socket_service_test.cpp @@ -498,4 +498,60 @@ HWTEST_F(TransClientSocketServiceTest, SetAccessInfo001, TestSize.Level1) int32_t ret = SetAccessInfo(socket, accessInfo); EXPECT_EQ(ret, SOFTBUS_INVALID_PARAM); } + +/** + * @tc.name: GetSocketOpt003 + * @tc.desc: call GetSocketOpt function with with valid parameter. + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(TransClientSocketServiceTest, GetSocketOpt003, TestSize.Level1) +{ + OptLevel level = OPT_LEVEL_SOFTBUS; + OptType optType = OPT_TYPE_MAX_BUFFER; + int socketId = 1; + uint32_t optValueValid = 0; + void *temp = &optValueValid; + int32_t valueSize = sizeof(uint32_t); + int32_t *optValueSizeValid = &valueSize; + int32_t ret = SetSocketOpt(socketId, level, optType, temp, valueSize); + ASSERT_EQ(ret, SOFTBUS_NOT_IMPLEMENT); + ret = GetSocketOpt(socketId, level, optType, temp, optValueSizeValid); + ASSERT_EQ(ret, SOFTBUS_NOT_IMPLEMENT); +} + +/** + * @tc.name: RegisterRelationChecker002 + * @tc.desc: call RegisterRelationChecker function with with invalid parameter. + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(TransClientSocketServiceTest, RegisterRelationChecker002, TestSize.Level1) +{ + int32_t ret = RegisterRelationChecker(nullptr); + ASSERT_EQ(ret, SOFTBUS_INVALID_PARAM); +} + +/** + * @tc.name: ServiceSocketPeerNetworkId001 + * @tc.desc: call ServiceSocket function with with invalid parameter. + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(TransClientSocketServiceTest, ServiceSocketPeerNetworkId001, TestSize.Level1) +{ + ServiceSocketInfo info; + char networkId[SOCKET_NETWORKID_INVALID_LEN + 1]; + memset_s(networkId, SOCKET_NETWORKID_INVALID_LEN + 1, 0, SOCKET_NETWORKID_INVALID_LEN + 1); + info.peerNetworkId = networkId; + info.dataType = static_cast(DATA_TYPE_BYTES); + info.serviceId = 50; + info.peerServiceId = 58; + int32_t socket = ServiceSocket(info); + EXPECT_EQ(socket, SOFTBUS_INVALID_PARAM); + memset_s(networkId, SOCKET_NETWORKID_INVALID_LEN + 1, 'a', SOCKET_NETWORKID_INVALID_LEN); + info.peerNetworkId = networkId; + socket = ServiceSocket(info); + ASSERT_EQ(socket, SOFTBUS_INVALID_PARAM); +} } // namespace OHOS diff --git a/tests/sdk/transmission/session/mock/include/trans_session_mgr_mock.h b/tests/sdk/transmission/session/mock/include/trans_session_mgr_mock.h index bac86537ff..a9f91be98d 100644 --- a/tests/sdk/transmission/session/mock/include/trans_session_mgr_mock.h +++ b/tests/sdk/transmission/session/mock/include/trans_session_mgr_mock.h @@ -59,6 +59,10 @@ public: virtual bool IsSessionExceedLimit(void) = 0; virtual int32_t ClientGetSessionIsD2DByChannelId(int32_t channelId, int32_t channelType, bool *isD2D) = 0; virtual int32_t ClientCheckIsD2DBySessionId(int32_t sessionId, bool *isD2D) = 0; + virtual int32_t ClientGetSessionNameByChannelId( + int32_t channelId, int32_t channelType, char *sessionName, int32_t len) = 0; + virtual int32_t ClientGetServiceSocketInfoById(int32_t socket, ServiceSocketInfo *socketInfo) = 0; + virtual bool IsContainServiceBySocket(int32_t socket) = 0; }; class TransSessionMgrMock : public TransSessionMgrInterface { @@ -99,6 +103,10 @@ public: MOCK_METHOD0(IsSessionExceedLimit, bool(void)); MOCK_METHOD3(ClientGetSessionIsD2DByChannelId, int32_t(int32_t channelId, int32_t channelType, bool *isD2D)); MOCK_METHOD2(ClientCheckIsD2DBySessionId, int32_t(int32_t sessionId, bool *isD2D)); + MOCK_METHOD4(ClientGetSessionNameByChannelId, + int32_t(int32_t channelId, int32_t channelType, char *sessionName, int32_t len)); + MOCK_METHOD2(ClientGetServiceSocketInfoById, int32_t(int32_t socket, ServiceSocketInfo *socketInfo)); + MOCK_METHOD1(IsContainServiceBySocket, bool(int32_t socket)); static int32_t ActionOfClientGetDataConfigByChannelId( int32_t channelId, int32_t channelType, uint32_t *dataConfig); diff --git a/tests/sdk/transmission/session/mock/src/trans_session_mgr_mock.cpp b/tests/sdk/transmission/session/mock/src/trans_session_mgr_mock.cpp index c4852ed165..77580bab34 100644 --- a/tests/sdk/transmission/session/mock/src/trans_session_mgr_mock.cpp +++ b/tests/sdk/transmission/session/mock/src/trans_session_mgr_mock.cpp @@ -198,6 +198,19 @@ int32_t ClientCheckIsD2DBySessionId(int32_t sessionId, bool *isD2D) { return GetManagerInterface()->ClientCheckIsD2DBySessionId(sessionId, isD2D); } + +int32_t ClientGetSessionNameByChannelId(int32_t channelId, int32_t channelType, char *sessionName, int32_t len) +{ + return GetManagerInterface()->ClientGetSessionNameByChannelId(channelId, channelType, sessionName, len); +} +int32_t ClientGetServiceSocketInfoById(int32_t socket, ServiceSocketInfo *socketInfo) +{ + return GetManagerInterface()->ClientGetServiceSocketInfoById(socket, socketInfo); +} +bool IsContainServiceBySocket(int32_t socket) +{ + return GetManagerInterface()->IsContainServiceBySocket(socket); +} #ifdef __cplusplus } #endif -- Gitee