diff mbox series

[v3,3/3] dpp: use the config's SSID to process scan results

Message ID 20231116191528.364340-3-prestwoj@gmail.com (mailing list archive)
State Accepted, archived
Headers show
Series [v3,1/3] dpp-util: store SSID as string, not raw buffer | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
prestwoj/iwd-ci-gitlint success GitLint

Commit Message

James Prestwood Nov. 16, 2023, 7:15 p.m. UTC
The scan result handling was fragile because it assumed the kernel
would only give results matching the requested SSID. This isn't
something we should assume so instead keep the configuration object
around until after the scan and use the target SSID to lookup the
network.
---
 src/dpp.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)
diff mbox series

Patch

diff --git a/src/dpp.c b/src/dpp.c
index 907f3bf5..f8d76805 100644
--- a/src/dpp.c
+++ b/src/dpp.c
@@ -856,7 +856,6 @@  static bool dpp_scan_results(int err, struct l_queue *bss_list,
 	struct dpp_sm *dpp = userdata;
 	struct station *station = station_find(netdev_get_ifindex(dpp->netdev));
 	struct scan_bss *bss;
-	char ssid[33];
 	struct network *network;
 
 	if (err < 0)
@@ -872,18 +871,18 @@  static bool dpp_scan_results(int err, struct l_queue *bss_list,
 	if (L_WARN_ON(station_get_connected_network(station)))
 		goto reset;
 
-	/* Purely for grabbing the SSID */
-	bss = l_queue_peek_head(bss_list);
-
-	memcpy(ssid, bss->ssid, bss->ssid_len);
-	ssid[bss->ssid_len] = '\0';
-
 	station_set_scan_results(station, bss_list, freqs, false);
 
-	network = station_network_find(station, ssid, SECURITY_PSK);
+	network = station_network_find(station, dpp->config->ssid,
+					SECURITY_PSK);
 
 	dpp_reset(dpp);
 
+	if (!network) {
+		l_debug("Network was not found after scanning");
+		return true;
+	}
+
 	bss = network_bss_select(network, true);
 	network_autoconnect(network, bss);
 
@@ -1084,7 +1083,7 @@  static void dpp_handle_config_response_frame(const struct mmpdu_header *frame,
 						dpp_scan_results, dpp,
 						dpp_scan_destroy);
 		if (dpp->connect_scan_id) {
-			dpp_configuration_free(config);
+			dpp->config = config;
 			return;
 		}
 	}