From bb66d467582a4e2ce954881f4d70217f99a8f3e2 Mon Sep 17 00:00:00 2001 From: Eric Caruso Date: Thu, 17 Oct 2019 16:03:50 -0700 Subject: [PATCH] Move ownership of MAC address randomization mask to scan params This array can be freed either from the scan parameters or from clearing the MAC address randomization parameters from the wpa_supplicant struct. To make this ownership more clear, we have each struct own its own copy of the parameters. Signed-off-by: Eric Caruso --- src/drivers/driver.h | 2 +- wpa_supplicant/scan.c | 79 ++++++++++++++++++++++--------------------- 2 files changed, 41 insertions(+), 40 deletions(-) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 7b0522d38..ad68a0765 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -517,7 +517,7 @@ struct wpa_driver_scan_params { * mac_addr - MAC address used with randomization. The address cannot be * a multicast one, i.e., bit 0 of byte 0 should not be set. */ - const u8 *mac_addr; + u8 *mac_addr; /** * mac_addr_mask - MAC address mask used with randomization. diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c index 7abb028dd..3edae43e8 100644 --- a/wpa_supplicant/scan.c +++ b/wpa_supplicant/scan.c @@ -79,6 +79,33 @@ static int wpas_wps_in_use(struct wpa_supplicant *wpa_s, #endif /* CONFIG_WPS */ +static int wpa_setup_mac_addr_rand_params(struct wpa_driver_scan_params *params, + const u8 *mac_addr) +{ + u8 *tmp; + + if (params->mac_addr) { + params->mac_addr_mask = NULL; + os_free(params->mac_addr); + params->mac_addr = NULL; + } + + params->mac_addr_rand = 1; + + if (!mac_addr) + return 0; + + tmp = os_malloc(2 * ETH_ALEN); + if (!tmp) + return -1; + + os_memcpy(tmp, mac_addr, 2 * ETH_ALEN); + params->mac_addr = tmp; + params->mac_addr_mask = tmp + ETH_ALEN; + return 0; +} + + /** * wpa_supplicant_enabled_networks - Check whether there are enabled networks * @wpa_s: Pointer to wpa_supplicant data @@ -1211,13 +1238,8 @@ ssid_list_set: #endif /* CONFIG_P2P */ if ((wpa_s->mac_addr_rand_enable & MAC_ADDR_RAND_SCAN) && - wpa_s->wpa_state <= WPA_SCANNING) { - params.mac_addr_rand = 1; - if (wpa_s->mac_addr_scan) { - params.mac_addr = wpa_s->mac_addr_scan; - params.mac_addr_mask = wpa_s->mac_addr_scan + ETH_ALEN; - } - } + wpa_s->wpa_state <= WPA_SCANNING) + wpa_setup_mac_addr_rand_params(¶ms, wpa_s->mac_addr_scan); if (!is_zero_ether_addr(wpa_s->next_scan_bssid)) { struct wpa_bss *bss; @@ -1286,6 +1308,7 @@ scan: wpabuf_free(extra_ie); os_free(params.freqs); os_free(params.filter_ssids); + os_free(params.mac_addr); if (ret) { wpa_msg(wpa_s, MSG_WARNING, "Failed to initiate AP scan"); @@ -1664,20 +1687,16 @@ scan: wpa_setband_scan_freqs(wpa_s, scan_params); if ((wpa_s->mac_addr_rand_enable & MAC_ADDR_RAND_SCHED_SCAN) && - wpa_s->wpa_state <= WPA_SCANNING) { - params.mac_addr_rand = 1; - if (wpa_s->mac_addr_sched_scan) { - params.mac_addr = wpa_s->mac_addr_sched_scan; - params.mac_addr_mask = wpa_s->mac_addr_sched_scan + - ETH_ALEN; - } - } + wpa_s->wpa_state <= WPA_SCANNING) + wpa_setup_mac_addr_rand_params(¶ms, + wpa_s->mac_addr_sched_scan); wpa_scan_set_relative_rssi_params(wpa_s, scan_params); ret = wpa_supplicant_start_sched_scan(wpa_s, scan_params); wpabuf_free(extra_ie); os_free(params.filter_ssids); + os_free(params.mac_addr); if (ret) { wpa_msg(wpa_s, MSG_WARNING, "Failed to initiate sched scan"); if (prev_state != wpa_s->wpa_state) @@ -2535,23 +2554,9 @@ wpa_scan_clone_params(const struct wpa_driver_scan_params *src) params->sched_scan_plans_num = src->sched_scan_plans_num; } - if (src->mac_addr_rand) { - params->mac_addr_rand = src->mac_addr_rand; - - if (src->mac_addr && src->mac_addr_mask) { - u8 *mac_addr; - - mac_addr = os_malloc(2 * ETH_ALEN); - if (!mac_addr) - goto failed; - - os_memcpy(mac_addr, src->mac_addr, ETH_ALEN); - os_memcpy(mac_addr + ETH_ALEN, src->mac_addr_mask, - ETH_ALEN); - params->mac_addr = mac_addr; - params->mac_addr_mask = mac_addr + ETH_ALEN; - } - } + if (src->mac_addr_rand && + wpa_setup_mac_addr_rand_params(params, src->mac_addr)) + goto failed; if (src->bssid) { u8 *bssid; @@ -2738,18 +2743,14 @@ int wpas_start_pno(struct wpa_supplicant *wpa_s) } if ((wpa_s->mac_addr_rand_enable & MAC_ADDR_RAND_PNO) && - wpa_s->wpa_state <= WPA_SCANNING) { - params.mac_addr_rand = 1; - if (wpa_s->mac_addr_pno) { - params.mac_addr = wpa_s->mac_addr_pno; - params.mac_addr_mask = wpa_s->mac_addr_pno + ETH_ALEN; - } - } + wpa_s->wpa_state <= WPA_SCANNING) + wpa_setup_mac_addr_rand_params(¶ms, wpa_s->mac_addr_pno); wpa_scan_set_relative_rssi_params(wpa_s, ¶ms); ret = wpa_supplicant_start_sched_scan(wpa_s, ¶ms); os_free(params.filter_ssids); + os_free(params.mac_addr); if (ret == 0) wpa_s->pno = 1; else