From: Jouni Malinen Date: Sun, 23 Feb 2025 11:06:01 +0000 (+0200) Subject: SME: Use a helper function for adding wpabuf to AssocReq IEs X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1c3b564af83b9928c6511a280396a73e939baf98;p=thirdparty%2Fhostap.git SME: Use a helper function for adding wpabuf to AssocReq IEs This was repeated multiple times and with slightly different set of style for checking for remaining room in the buffer. Signed-off-by: Jouni Malinen --- diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c index 806e4b1ef..941d031cb 100644 --- a/wpa_supplicant/sme.c +++ b/wpa_supplicant/sme.c @@ -551,6 +551,28 @@ static void wpas_sme_set_mlo_links(struct wpa_supplicant *wpa_s, } +static void sme_add_assoc_req_ie(struct wpa_supplicant *wpa_s, + const struct wpabuf *buf) +{ + size_t len; + u8 *pos, *end; + + if (!buf) + return; + + pos = wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len; + end = wpa_s->sme.assoc_req_ie + sizeof(wpa_s->sme.assoc_req_ie); + if (pos >= end) + return; + + len = wpabuf_len(buf); + if (len < (size_t) (end - pos)) { + os_memcpy(pos, wpabuf_head(buf), len); + wpa_s->sme.assoc_req_ie_len += len; + } +} + + static void sme_send_authentication(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, struct wpa_ssid *ssid, int start) @@ -743,14 +765,10 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, #ifdef CONFIG_WPS } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) { struct wpabuf *wps_ie; + + wpa_s->sme.assoc_req_ie_len = 0; wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid)); - if (wps_ie && wpabuf_len(wps_ie) <= - sizeof(wpa_s->sme.assoc_req_ie)) { - wpa_s->sme.assoc_req_ie_len = wpabuf_len(wps_ie); - os_memcpy(wpa_s->sme.assoc_req_ie, wpabuf_head(wps_ie), - wpa_s->sme.assoc_req_ie_len); - } else - wpa_s->sme.assoc_req_ie_len = 0; + sme_add_assoc_req_ie(wpa_s, wps_ie); wpabuf_free(wps_ie); wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); #endif /* CONFIG_WPS */ @@ -857,18 +875,7 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, #endif /* CONFIG_P2P */ #ifdef CONFIG_FST - if (wpa_s->fst_ies) { - int fst_ies_len = wpabuf_len(wpa_s->fst_ies); - - if (wpa_s->sme.assoc_req_ie_len + fst_ies_len <= - sizeof(wpa_s->sme.assoc_req_ie)) { - os_memcpy(wpa_s->sme.assoc_req_ie + - wpa_s->sme.assoc_req_ie_len, - wpabuf_head(wpa_s->fst_ies), - fst_ies_len); - wpa_s->sme.assoc_req_ie_len += fst_ies_len; - } - } + sme_add_assoc_req_ie(wpa_s, wpa_s->fst_ies); #endif /* CONFIG_FST */ sme_auth_handle_rrm(wpa_s, bss); @@ -911,15 +918,9 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, } #ifdef CONFIG_TESTING_OPTIONS - if (wpa_s->rsnxe_override_assoc && - wpabuf_len(wpa_s->rsnxe_override_assoc) <= - sizeof(wpa_s->sme.assoc_req_ie) - wpa_s->sme.assoc_req_ie_len) { + if (wpa_s->rsnxe_override_assoc) { wpa_printf(MSG_DEBUG, "TESTING: RSNXE AssocReq override"); - os_memcpy(wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len, - wpabuf_head(wpa_s->rsnxe_override_assoc), - wpabuf_len(wpa_s->rsnxe_override_assoc)); - wpa_s->sme.assoc_req_ie_len += - wpabuf_len(wpa_s->rsnxe_override_assoc); + sme_add_assoc_req_ie(wpa_s, wpa_s->rsnxe_override_assoc); } else #endif /* CONFIG_TESTING_OPTIONS */ if (wpa_s->rsnxe_len > 0 && @@ -940,18 +941,9 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, params.mld ? params.ap_mld_addr : bss->bssid, bss->tsf); if (e) { - size_t len; - - len = sizeof(wpa_s->sme.assoc_req_ie) - - wpa_s->sme.assoc_req_ie_len; - if (wpabuf_len(e) <= len) { - wpa_printf(MSG_DEBUG, - "SME: Add Known STA Identification element"); - os_memcpy(wpa_s->sme.assoc_req_ie + - wpa_s->sme.assoc_req_ie_len, - wpabuf_head(e), wpabuf_len(e)); - wpa_s->sme.assoc_req_ie_len += wpabuf_len(e); - } + wpa_printf(MSG_DEBUG, + "SME: Add Known STA Identification element"); + sme_add_assoc_req_ie(wpa_s, e); wpabuf_free(e); } } @@ -963,19 +955,11 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, hs20 = wpabuf_alloc(20 + MAX_ROAMING_CONS_OI_LEN); if (hs20) { int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid); - size_t len; wpas_hs20_add_indication(hs20, pps_mo_id, get_hs20_version(bss)); wpas_hs20_add_roam_cons_sel(hs20, ssid); - len = sizeof(wpa_s->sme.assoc_req_ie) - - wpa_s->sme.assoc_req_ie_len; - if (wpabuf_len(hs20) <= len) { - os_memcpy(wpa_s->sme.assoc_req_ie + - wpa_s->sme.assoc_req_ie_len, - wpabuf_head(hs20), wpabuf_len(hs20)); - wpa_s->sme.assoc_req_ie_len += wpabuf_len(hs20); - } + sme_add_assoc_req_ie(wpa_s, hs20); wpabuf_free(hs20); } } @@ -1001,19 +985,7 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, os_free(wpa_ie); } - if (wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]) { - struct wpabuf *buf = wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]; - size_t len; - - len = sizeof(wpa_s->sme.assoc_req_ie) - - wpa_s->sme.assoc_req_ie_len; - if (wpabuf_len(buf) <= len) { - os_memcpy(wpa_s->sme.assoc_req_ie + - wpa_s->sme.assoc_req_ie_len, - wpabuf_head(buf), wpabuf_len(buf)); - wpa_s->sme.assoc_req_ie_len += wpabuf_len(buf); - } - } + sme_add_assoc_req_ie(wpa_s, wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]); #ifdef CONFIG_MBO mbo_ie = wpa_bss_get_vendor_ie(bss, MBO_IE_VENDOR_TYPE);