Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 359ce507 authored by Johannes Berg's avatar Johannes Berg Committed by Greg Kroah-Hartman
Browse files

wifi: cfg80211: ensure length byte is present before access



commit 567e14e39e8f8c6997a1378bc3be615afca86063 upstream.

When iterating the elements here, ensure the length byte is
present before checking it to see if the entire element will
fit into the buffer.

Longer term, we should rewrite this code using the type-safe
element iteration macros that check all of this.

Fixes: 0b8fb823 ("cfg80211: Parsing of Multiple BSSID information in scanning")
Reported-by: default avatarSoenke Huster <shuster@seemoo.tu-darmstadt.de>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 43689bf2
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -265,7 +265,8 @@ static size_t cfg80211_gen_new_ie(const u8 *ie, size_t ielen,
	tmp_old = cfg80211_find_ie(WLAN_EID_SSID, ie, ielen);
	tmp_old = cfg80211_find_ie(WLAN_EID_SSID, ie, ielen);
	tmp_old = (tmp_old) ? tmp_old + tmp_old[1] + 2 : ie;
	tmp_old = (tmp_old) ? tmp_old + tmp_old[1] + 2 : ie;


	while (tmp_old + tmp_old[1] + 2 - ie <= ielen) {
	while (tmp_old + 2 - ie <= ielen &&
	       tmp_old + tmp_old[1] + 2 - ie <= ielen) {
		if (tmp_old[0] == 0) {
		if (tmp_old[0] == 0) {
			tmp_old++;
			tmp_old++;
			continue;
			continue;
@@ -325,7 +326,8 @@ static size_t cfg80211_gen_new_ie(const u8 *ie, size_t ielen,
	 * copied to new ie, skip ssid, capability, bssid-index ie
	 * copied to new ie, skip ssid, capability, bssid-index ie
	 */
	 */
	tmp_new = sub_copy;
	tmp_new = sub_copy;
	while (tmp_new + tmp_new[1] + 2 - sub_copy <= subie_len) {
	while (tmp_new + 2 - sub_copy <= subie_len &&
	       tmp_new + tmp_new[1] + 2 - sub_copy <= subie_len) {
		if (!(tmp_new[0] == WLAN_EID_NON_TX_BSSID_CAP ||
		if (!(tmp_new[0] == WLAN_EID_NON_TX_BSSID_CAP ||
		      tmp_new[0] == WLAN_EID_SSID)) {
		      tmp_new[0] == WLAN_EID_SSID)) {
			memcpy(pos, tmp_new, tmp_new[1] + 2);
			memcpy(pos, tmp_new, tmp_new[1] + 2);