From 82982c94fe0efda027a744471264a5b33feabbe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E6=99=93=E6=99=93?= Date: Mon, 14 Jul 2025 16:41:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 史晓晓 --- .../src/advertise/advertise_manager.cpp | 18 +++- .../src/discovery/discovery_manager.cpp | 93 +++++++++---------- utils/src/dm_random.cpp | 10 +- 3 files changed, 66 insertions(+), 55 deletions(-) diff --git a/services/service/src/advertise/advertise_manager.cpp b/services/service/src/advertise/advertise_manager.cpp index 769ba0ba5..ec94e491a 100644 --- a/services/service/src/advertise/advertise_manager.cpp +++ b/services/service/src/advertise/advertise_manager.cpp @@ -153,8 +153,14 @@ int32_t AdvertiseManager::GenInnerPublishId(const std::string &pkgName, int32_t int32_t tempPublishId = DM_INVALID_FLAG_ID; { std::lock_guard autoLock(pubMapLock_); - if (pkgName2PubIdMap_[pkgName].find(publishId) != pkgName2PubIdMap_[pkgName].end()) { - return pkgName2PubIdMap_[pkgName][publishId]; + if (pkgName2PubIdMap_.find(pkgName) != pkgName2PubIdMap_.end()) { + if (pkgName2PubIdMap_[pkgName].find(publishId) != pkgName2PubIdMap_[pkgName].end()) { + return pkgName2PubIdMap_[pkgName][publishId]; + } + } + if (publishIdSet_.size() >= (DM_MAX_RANDOM - 1)) { + LOGE("The publishIdSet_ cache size exceed the limit."); + return tempPublishId; } if (pkgName2PubIdMap_.find(pkgName) == pkgName2PubIdMap_.end()) { pkgName2PubIdMap_[pkgName] = std::map(); @@ -202,9 +208,11 @@ void AdvertiseManager::ClearPublishIdCache(const std::string &pkgName) } LOGI("Begin for pkgName = %{public}s.", pkgName.c_str()); std::lock_guard autoLock(pubMapLock_); - for (auto iter : pkgName2PubIdMap_[pkgName]) { - softbusListener_->StopPublishSoftbusLNN(iter.second); - publishIdSet_.erase(iter.second); + if (pkgName2PubIdMap.find(pkgName) != pkgName2PubIdMap.end()) { + for (auto iter : pkgName2PubIdMap_[pkgName]) { + softbusListener_->StopPublishSoftbusLNN(iter.second); + publishIdSet_.erase(iter.second); + } } pkgName2PubIdMap_.erase(pkgName); } diff --git a/services/service/src/discovery/discovery_manager.cpp b/services/service/src/discovery/discovery_manager.cpp index a26cf7af1..e401fbc3b 100644 --- a/services/service/src/discovery/discovery_manager.cpp +++ b/services/service/src/discovery/discovery_manager.cpp @@ -128,6 +128,10 @@ int32_t DiscoveryManager::DisableDiscoveryListener(const std::string &pkgName, static_cast(std::atoi((extraParam.find(PARAM_KEY_SUBSCRIBE_ID)->second).c_str())); innerSubId = GetAndRemoveInnerSubId(pkgNameTemp, externalSubId); } + if (innerSubId == DM_INVALID_FLAG_ID) { + LOGE("Invalid parameter, cannot find subscribeId in cache map."); + return ERR_DM_INPUT_PARA_INVALID; + } { std::lock_guard capLock(capabilityMapLocks_); if (capabilityMap_.find(pkgNameTemp) != capabilityMap_.end()) { @@ -135,10 +139,6 @@ int32_t DiscoveryManager::DisableDiscoveryListener(const std::string &pkgName, } } softbusListener_->UnRegisterSoftbusLnnOpsCbk(pkgNameTemp); - if (innerSubId == DM_INVALID_FLAG_ID) { - LOGE("Invalid parameter, cannot find subscribeId in cache map."); - return ERR_DM_INPUT_PARA_INVALID; - } return softbusListener_->StopRefreshSoftbusLNN(innerSubId); } @@ -412,25 +412,20 @@ void DiscoveryManager::OnDeviceFound(const std::string &pkgName, const uint32_t uint16_t externalSubId = DM_INVALID_FLAG_ID; { std::lock_guard autoLock(subIdMapLocks_); - for (auto iter : pkgName2SubIdMap_[pkgName]) { - externalSubId = iter.first; - break; - } - } - if (!isIndiscoveryContextMap) { - { - std::lock_guard capLock(capabilityMapLocks_); - if (capabilityMap_.find(pkgName) == capabilityMap_.end() || - !CompareCapability(capabilityType, capabilityMap_[pkgName])) { - return; + if (pkgName2SubIdMap_.find(pkgName) != pkgName2SubIdMap_.end()) { + for (auto iter : pkgName2SubIdMap_[pkgName]) { + externalSubId = iter.first; + break; } } - LOGD("OnDeviceFound, pkgName = %{public}s, cabability = %{public}d", pkgName.c_str(), capabilityType); - listener_->OnDeviceFound(processInfo, externalSubId, info); + } + if (externalSubId == DM_INVALID_FLAG_ID) { + LOGE("cannot find pkgName = %{public}s in cache map.", pkgName.c_str()); return; } DiscoveryFilter filter; - if (filter.IsValidDevice(discoveryContext.filterOp, discoveryContext.filters, filterPara)) { + if (!isIndiscoveryContextMap || + filter.IsValidDevice(discoveryContext.filterOp, discoveryContext.filters, filterPara)) { { std::lock_guard capLock(capabilityMapLocks_); if (capabilityMap_.find(pkgName) == capabilityMap_.end() || @@ -470,36 +465,36 @@ void DiscoveryManager::OnDiscoveringResult(const std::string &pkgName, int32_t s uint16_t externalSubId = DM_INVALID_FLAG_ID; { std::lock_guard autoLock(subIdMapLocks_); - for (auto iter : pkgName2SubIdMap_[pkgName]) { - if (iter.second == subscribeId) { - externalSubId = iter.first; - break; + if (pkgName2SubIdMap_.find(pkgName) != pkgName2SubIdMap_.end()) { + for (auto iter : pkgName2SubIdMap_[pkgName]) { + if (iter.second == subscribeId) { + externalSubId = iter.first; + break; + } } } } + if (externalSubId == DM_INVALID_FLAG_ID) { + LOGE("cannot find pkgName = %{public}s in cache map.", pkgName.c_str()); + return; + } if (result == 0) { std::lock_guard autoLock(locks_); - discoveryContextMap_[pkgName].subscribeId = (uint32_t)externalSubId; + discoveryContextMap_[pkgName].subscribeId = externalSubId; listener_->OnDiscoverySuccess(processInfo, externalSubId); return; } { std::lock_guard autoLock(locks_); - if (pkgNameSet_.find(pkgName) != pkgNameSet_.end()) { - pkgNameSet_.erase(pkgName); - } - if (discoveryContextMap_.find(pkgName) != discoveryContextMap_.end()) { - discoveryContextMap_.erase(pkgName); - if (timer_ != nullptr) { - timer_->DeleteTimer(pkgName); - } + pkgNameSet_.erase(pkgName); + discoveryContextMap_.erase(pkgName); + if (timer_ != nullptr) { + timer_->DeleteTimer(pkgName); } } { std::lock_guard capLock(capabilityMapLocks_); - if (capabilityMap_.find(pkgName) != capabilityMap_.end()) { - capabilityMap_.erase(pkgName); - } + capabilityMap_.erase(pkgName); } listener_->OnDiscoveryFailed(processInfo, (uint32_t)externalSubId, result); softbusListener_->StopRefreshSoftbusLNN(subscribeId); @@ -673,14 +668,10 @@ void DiscoveryManager::ClearDiscoveryCache(const ProcessInfo &processInfo) for (auto it : subscribeIdSet) { std::string pkgNameTemp = (ComposeStr(ComposeStr(processInfo.pkgName, it), processInfo.userId)); softbusListener_->UnRegisterSoftbusLnnOpsCbk(pkgNameTemp); - uint16_t innerSubId = DM_INVALID_FLAG_ID; - { - std::lock_guard autoLock(subIdMapLocks_); - innerSubId = static_cast(pkgName2SubIdMap_[pkgNameTemp][it]); - randSubIdSet_.erase(innerSubId); - pkgName2SubIdMap_.erase(pkgNameTemp); + uint16_t innerSubId = GetAndRemoveInnerSubId(pkgNameTemp, it); + if (innerSubId != DM_INVALID_FLAG_ID) { + softbusListener_->StopRefreshSoftbusLNN(innerSubId); } - softbusListener_->StopRefreshSoftbusLNN(innerSubId); } CHECK_NULL_VOID(timer_); @@ -798,10 +789,16 @@ int32_t DiscoveryManager::GenInnerSubId(const std::string &pkgName, uint16_t sub uint16_t tempSubId = DM_INVALID_FLAG_ID; { std::lock_guard autoLock(subIdMapLocks_); - if (pkgName2SubIdMap_[pkgName].find(subId) != pkgName2SubIdMap_[pkgName].end()) { - return pkgName2SubIdMap_[pkgName][subId]; + if (pkgName2SubIdMap_.find(pkgName) != pkgName2SubIdMap_.end()) { + if (pkgName2SubIdMap_[pkgName].find(subId) != pkgName2SubIdMap_[pkgName].end()) { + return pkgName2SubIdMap_[pkgName][subId]; + } } if (pkgName2SubIdMap_.find(pkgName) == pkgName2SubIdMap_.end()) { + if (pkgName2SubIdMap_.size() >= UINT16_MAX) { + LOGE("The pkgName2SubIdMap_ cache size exceed the limit."); + return tempSubId; + } pkgName2SubIdMap_[pkgName] = std::map(); } tempSubId = GenUniqueRandUint(randSubIdSet_); @@ -815,10 +812,12 @@ int32_t DiscoveryManager::GetAndRemoveInnerSubId(const std::string &pkgName, uin uint16_t tempSubId = DM_INVALID_FLAG_ID; { std::lock_guard autoLock(subIdMapLocks_); - if (pkgName2SubIdMap_[pkgName].find(subId) != pkgName2SubIdMap_[pkgName].end()) { - tempSubId = pkgName2SubIdMap_[pkgName][subId]; - pkgName2SubIdMap_[pkgName].erase(subId); - randSubIdSet_.erase(tempSubId); + if (pkgName2SubIdMap_.find(pkgName) != pkgName2SubIdMap_.end()) { + if (pkgName2SubIdMap_[pkgName].find(subId) != pkgName2SubIdMap_[pkgName].end()) { + tempSubId = pkgName2SubIdMap_[pkgName][subId]; + pkgName2SubIdMap_[pkgName].erase(subId); + randSubIdSet_.erase(tempSubId); + } } if (pkgName2SubIdMap_[pkgName].empty()) { pkgName2SubIdMap_.erase(pkgName); diff --git a/utils/src/dm_random.cpp b/utils/src/dm_random.cpp index d14c4b73d..bdb6c1169 100644 --- a/utils/src/dm_random.cpp +++ b/utils/src/dm_random.cpp @@ -26,9 +26,9 @@ namespace OHOS { namespace DistributedHardware { namespace { -const int32_t DM_MIN_RANDOM = 1; -const int32_t DM_MAX_RANDOM_UINT16 = INT16_MAX; -const int32_t DM_INVALID_FLAG_ID = 0; +const uint16_t DM_MIN_RANDOM = 1; +const uint16_t DM_MAX_RANDOM_UINT16 = UINT16_MAX; +const uint16_t DM_INVALID_FLAG_ID = 0; } int32_t GenRandInt(int32_t randMin, int32_t randMax) @@ -63,6 +63,10 @@ uint16_t GenRandUint(uint16_t randMin, uint16_t randMax) uint16_t GenUniqueRandUint(std::set &randUint16Set) { uint16_t randUint = DM_INVALID_FLAG_ID; + if (randUint16Set.size() == DM_MAX_RANDOM_UINT16) { + LOGE("The randUint16Set cache size exceed the limit."); + return randUint; + } bool isExist = false; do { randUint = GenRandInt(DM_MIN_RANDOM, DM_MAX_RANDOM_UINT16); -- Gitee