Index: net80211/ieee80211_wireless.c =================================================================== --- net80211/ieee80211_wireless.c (revision 1600) +++ net80211/ieee80211_wireless.c (working copy) @@ -1425,6 +1425,8 @@ memcpy(p, leader, leader_len); bufsize -= leader_len; p += leader_len; + if (bufsize < ielen) + return 0; for (i = 0; i < ielen && bufsize > 2; i++) p += sprintf(p, "%02x", ie[i]); return (i == ielen ? p - (u_int8_t *)buf : 0); @@ -1446,7 +1448,8 @@ char *current_ev = req->current_ev; char *end_buf = req->end_buf; #if WIRELESS_EXT > 14 - char buf[64 * 2 + 30]; +#define MAX_IE_LENGTH 64 * 2 + 30 + char buf[MAX_IE_LENGTH]; #endif struct iw_event iwe; char *current_val; @@ -1548,6 +1551,8 @@ if (se->se_rsn_ie != NULL) { #ifdef IWEVGENIE memset(&iwe, 0, sizeof(iwe)); + if ((se->se_rsn_ie[1] + 2) > MAX_IE_LENGTH) + return; memcpy(buf, se->se_rsn_ie, se->se_rsn_ie[1] + 2); iwe.cmd = IWEVGENIE; iwe.u.data.length = se->se_rsn_ie[1] + 2; @@ -1568,6 +1573,8 @@ if (se->se_wpa_ie != NULL) { #ifdef IWEVGENIE memset(&iwe, 0, sizeof(iwe)); + if ((se->se_wpa_ie[1] + 2) > MAX_IE_LENGTH) + return; memcpy(buf, se->se_wpa_ie, se->se_wpa_ie[1] + 2); iwe.cmd = IWEVGENIE; iwe.u.data.length = se->se_wpa_ie[1] + 2;