Module Name: src Committed By: maxv Date: Tue Jan 16 16:54:54 UTC 2018
Modified Files: src/sys/net80211: ieee80211_input.c Log Message: Add comments about the length checks, and check xrates. To generate a diff of this commit: cvs rdiff -u -r1.105 -r1.106 src/sys/net80211/ieee80211_input.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net80211/ieee80211_input.c diff -u src/sys/net80211/ieee80211_input.c:1.105 src/sys/net80211/ieee80211_input.c:1.106 --- src/sys/net80211/ieee80211_input.c:1.105 Tue Jan 16 16:31:37 2018 +++ src/sys/net80211/ieee80211_input.c Tue Jan 16 16:54:54 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ieee80211_input.c,v 1.105 2018/01/16 16:31:37 maxv Exp $ */ +/* $NetBSD: ieee80211_input.c,v 1.106 2018/01/16 16:54:54 maxv Exp $ */ /* * Copyright (c) 2001 Atsushi Onoe @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.81 2005/08/10 16:22:29 sam Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.105 2018/01/16 16:31:37 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.106 2018/01/16 16:54:54 maxv Exp $"); #endif #ifdef _KERNEL_OPT @@ -2057,12 +2057,15 @@ ieee80211_recv_mgmt_beacon(struct ieee80 switch (*frm) { case IEEE80211_ELEMID_SSID: + /* no length check needed */ scan.ssid = frm; break; case IEEE80211_ELEMID_RATES: + /* no length check needed */ scan.rates = frm; break; case IEEE80211_ELEMID_COUNTRY: + /* XXX: we don't do anything with this? */ scan.country = frm; break; case IEEE80211_ELEMID_FHPARMS: @@ -2091,6 +2094,12 @@ ieee80211_recv_mgmt_beacon(struct ieee80 case IEEE80211_ELEMID_IBSSPARMS: break; case IEEE80211_ELEMID_XRATES: + if (frm[1] > IEEE80211_RATE_MAXSIZE) { + IEEE80211_DISCARD_IE(ic, IEEE80211_MSG_ELEMID, + wh, "XRATE", "bad len %u", frm[1]); + ic->ic_stats.is_rx_elem_toobig++; + break; + } scan.xrates = frm; break; case IEEE80211_ELEMID_ERP: @@ -2103,9 +2112,11 @@ ieee80211_recv_mgmt_beacon(struct ieee80 scan.erp = frm[2]; break; case IEEE80211_ELEMID_RSN: + /* no length check needed */ scan.wpa = frm; break; case IEEE80211_ELEMID_VENDOR: + /* no length check needed */ if (iswpaoui(frm)) scan.wpa = frm; else if (iswmeparam(frm) || iswmeinfo(frm))