summaryrefslogtreecommitdiff
path: root/wifi/1.5/default/wifi_chip.cpp
diff options
context:
space:
mode:
authorJimmy Chen <jimmycmchen@google.com>2019-11-29 17:31:22 +0200
committerJimmy Chen <jimmycmchen@google.com>2020-08-11 14:18:59 +0800
commit7a82ad8c6acffb91750bea53c46a41f82c740950 (patch)
treecde62c776e6742819f8e39ba7c4f7aa0d5fcaf58 /wifi/1.5/default/wifi_chip.cpp
parentd4d6796bf5e2ac4cd901bb42f4a64d5d4ca7d5a7 (diff)
Wifi: fix bug during WIFI HAL stop
In WifiChip::invalidateAndRemoveDependencies, the iterator was not implemented correctly as it was deleting objects while iterating. This could cause the entire WIFI HAL to be restarted when disabling WIFI. Bug: 146922967 Test: atest VtsHalWifiV1_0TargetTest VtsHalWifiNanV1_0TargetTest VtsHalWifiApV1_0TargetTest \ VtsHalWifiV1_1TargetTest \ VtsHalWifiV1_2TargetTest VtsHalWifiNanV1_2TargetTest \ VtsHalWifiV1_3TargetTest \ VtsHalWifiApV1_4TargetTest VtsHalWifiNanV1_4TargetTest VtsHalWifiRttV1_4TargetTest Change-Id: Id86f1a662684467d3b86a79b271144ac3055d0a0
Diffstat (limited to 'wifi/1.5/default/wifi_chip.cpp')
-rw-r--r--wifi/1.5/default/wifi_chip.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/wifi/1.5/default/wifi_chip.cpp b/wifi/1.5/default/wifi_chip.cpp
index 069fd65054..b898f686eb 100644
--- a/wifi/1.5/default/wifi_chip.cpp
+++ b/wifi/1.5/default/wifi_chip.cpp
@@ -681,9 +681,10 @@ void WifiChip::invalidateAndRemoveAllIfaces() {
void WifiChip::invalidateAndRemoveDependencies(
const std::string& removed_iface_name) {
- for (const auto& nan_iface : nan_ifaces_) {
+ for (auto it = nan_ifaces_.begin(); it != nan_ifaces_.end();) {
+ auto nan_iface = *it;
if (nan_iface->getName() == removed_iface_name) {
- invalidateAndClear(nan_ifaces_, nan_iface);
+ nan_iface->invalidate();
for (const auto& callback : event_cb_handler_.getCallbacks()) {
if (!callback
->onIfaceRemoved(IfaceType::NAN, removed_iface_name)
@@ -691,11 +692,19 @@ void WifiChip::invalidateAndRemoveDependencies(
LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
}
}
+ it = nan_ifaces_.erase(it);
+ } else {
+ ++it;
}
}
- for (const auto& rtt : rtt_controllers_) {
+
+ for (auto it = rtt_controllers_.begin(); it != rtt_controllers_.end();) {
+ auto rtt = *it;
if (rtt->getIfaceName() == removed_iface_name) {
- invalidateAndClear(rtt_controllers_, rtt);
+ rtt->invalidate();
+ it = rtt_controllers_.erase(it);
+ } else {
+ ++it;
}
}
}