[PATCH] wifi:Fix the crash issue when restarting the wpa_supplicant or wifi driver while BackgroundScanning is enable
yaming.chen <[email protected]> Wed, 14 Jan 2026 16:06:41 +0800
| Newsgroups | dev.linux.lists.connman |
|---|---|
| Message-ID | <[email protected]> |
If BackgroundScanning is enable, passive auto scanning timeout work need to
be removed when a new active scanning is triggered.Because wifi->autoscan
and auto scanning timeout work will be receated for new active scanning, but
old passive auto scanning timeout work is still running, if wifi firmware or
wpa_supplicant is restarted at some time in the future, old wifi and autoscan
objects pointers will be freed, so wifi and wifi->autoscan objects pointers will
be dangling pointers when the timeout handler function of old passive scanning
work will obtain wifi and wifi->autoscan objects, it will trigger a crash of connman.
---
plugins/wifi.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 12389fa6..191c4fa0 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -1999,13 +1999,25 @@ static int wifi_scan(struct connman_device *device,
}
}
+ /*
+ * If BackgroundScanning is enable, passive auto scanning timeout work need to
+ * be removed when a new active scanning is triggered.Because wifi->autoscan
+ * and auto scanning timeout work will be receated for new active scanning, but
+ * old passive auto scanning timeout work is still running, if wifi firmware or
+ * wpa_supplicant is restarted at some time in the future, old wifi and autoscan
+ * objects pointers will be freed, so wifi and wifi->autoscan objects pointers will
+ * be dangling pointers when the timeout handler function of old passive scanning
+ * work will obtain wifi and wifi->autoscan objects, it will trigger a crash of connman.
+ */
+ if (connman_setting_get_bool("BackgroundScanning") ||
+ wifi->scanning_type != WIFI_SCANNING_PASSIVE) {
+ connman_device_ref(device);
+ reset_autoscan(device);
+ }
+
/* Distinguish between devices performing passive and active scanning */
wifi_update_scanner_type(wifi, WIFI_SCANNING_ACTIVE);
- connman_device_ref(device);
-
- reset_autoscan(device);
-
ret = g_supplicant_interface_scan(wifi->interface, scan_params,
scan_callback, device);
if (ret == 0) {
--
2.34.1