[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