diff --git a/services/service/src/advertise/advertise_manager.cpp b/services/service/src/advertise/advertise_manager.cpp index 769ba0ba5c2ff3ab9aadee7ab59a06ae4937ed4f..ec94e491ad61443be062e9c0a108ab84ef0d156c 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 a26cf7af14d7807632b82035ece290598cd9caa6..e401fbc3b614bad2a4c7e47646d4f9ca830b6054 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 d14c4b73da9c6acd54ae3c71ff98bd6cea19bfd5..bdb6c11695e5882022290651fe8a8b98d4ca48bf 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);