diff options
author | Jimmy Chen <jimmycmchen@google.com> | 2019-11-29 17:31:22 +0200 |
---|---|---|
committer | Jimmy Chen <jimmycmchen@google.com> | 2020-08-11 14:18:59 +0800 |
commit | 7a82ad8c6acffb91750bea53c46a41f82c740950 (patch) | |
tree | cde62c776e6742819f8e39ba7c4f7aa0d5fcaf58 /wifi/1.5/default/wifi_chip.cpp | |
parent | d4d6796bf5e2ac4cd901bb42f4a64d5d4ca7d5a7 (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.cpp | 17 |
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; } } } |