};
-static void nl80211_get_basic_mle_links_info(const u8 *mle, size_t mle_len,
+static void nl80211_get_basic_mle_links_info(struct wpabuf *mlbuf,
struct links_info *info)
{
size_t rem_len;
const u8 *pos;
+ const u8 *mle = wpabuf_head(mlbuf);
+ size_t mle_len = wpabuf_len(mlbuf);
if (mle_len < MULTI_LINK_CONTROL_LEN + 1 ||
mle_len - MULTI_LINK_CONTROL_LEN < mle[MULTI_LINK_CONTROL_LEN])
/* Parse Subelements */
while (rem_len > 2) {
- size_t ie_len = 2 + pos[1];
+ size_t ie_len, subelem_defrag_len;
+ int num_frag_subelems;
+
+ num_frag_subelems =
+ ieee802_11_defrag_mle_subelem(mlbuf, pos,
+ &subelem_defrag_len);
+ if (num_frag_subelems < 0) {
+ wpa_printf(MSG_DEBUG,
+ "nl80211: Failed to parse MLE subelem");
+ break;
+ }
+
+ ie_len = 2 + subelem_defrag_len;
+ rem_len -= num_frag_subelems * 2;
if (rem_len < ie_len)
break;
const u8 *sta_profile;
u16 sta_ctrl;
- if (pos[1] < BASIC_MLE_STA_PROF_STA_MAC_IDX + ETH_ALEN)
+ if (subelem_defrag_len <
+ BASIC_MLE_STA_PROF_STA_MAC_IDX + ETH_ALEN)
goto next_subelem;
sta_profile = &pos[2];
return -1;
}
os_memset(&req_info, 0, sizeof(req_info));
- nl80211_get_basic_mle_links_info(wpabuf_head(mle), wpabuf_len(mle),
- &req_info);
+ nl80211_get_basic_mle_links_info(mle, &req_info);
wpabuf_free(mle);
mle = ieee802_11_defrag(resp_elems.basic_mle, resp_elems.basic_mle_len,
return -1;
}
os_memset(&resp_info, 0, sizeof(resp_info));
- nl80211_get_basic_mle_links_info(wpabuf_head(mle), wpabuf_len(mle),
- &resp_info);
+ nl80211_get_basic_mle_links_info(mle, &resp_info);
wpabuf_free(mle);
if (req_info.non_assoc_links != resp_info.non_assoc_links) {