]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
SME: Use a helper function for adding wpabuf to AssocReq IEs
authorJouni Malinen <j@w1.fi>
Sun, 23 Feb 2025 11:06:01 +0000 (13:06 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 23 Feb 2025 11:06:01 +0000 (13:06 +0200)
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 <j@w1.fi>
wpa_supplicant/sme.c

index 806e4b1efa31da53e4a73ae1666de27b357e872f..941d031cb891c2eaa785cbf8f683c0313f7e9d93 100644 (file)
@@ -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);