|
Takashi Iwai |
f9a2be |
From 8223ac199a3849257e86ec27865dc63f034b1cf1 Mon Sep 17 00:00:00 2001
|
|
Takashi Iwai |
f9a2be |
From: Johannes Berg <johannes.berg@intel.com>
|
|
Takashi Iwai |
f9a2be |
Date: Fri, 1 Oct 2021 21:11:08 +0200
|
|
Takashi Iwai |
f9a2be |
Subject: [PATCH] mac80211: fix memory leaks with element parsing
|
|
Takashi Iwai |
f9a2be |
Git-commit: 8223ac199a3849257e86ec27865dc63f034b1cf1
|
|
Takashi Iwai |
f9a2be |
Patch-mainline: v5.16-rc1
|
|
Takashi Iwai |
f9a2be |
References: CVE-2022-42719 bsc#1204051
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
My previous commit 5d24828d05f3 ("mac80211: always allocate
|
|
Takashi Iwai |
f9a2be |
struct ieee802_11_elems") had a few bugs and leaked the new
|
|
Takashi Iwai |
f9a2be |
allocated struct in a few error cases, fix that.
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
Fixes: 5d24828d05f3 ("mac80211: always allocate struct ieee802_11_elems")
|
|
Takashi Iwai |
f9a2be |
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
Takashi Iwai |
f9a2be |
Link: https://lore.kernel.org/r/20211001211108.9839928e42e0.Ib81ca187d3d3af7ed1bfeac2e00d08a4637c8025@changeid
|
|
Takashi Iwai |
f9a2be |
Acked-by: Takashi Iwai <tiwai@suse.de>
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
---
|
|
Takashi Iwai |
f9a2be |
net/mac80211/agg-rx.c | 3 ++-
|
|
Takashi Iwai |
f9a2be |
net/mac80211/ibss.c | 10 +++++-----
|
|
Takashi Iwai |
f9a2be |
net/mac80211/mlme.c | 36 ++++++++++++++++++------------------
|
|
Takashi Iwai |
f9a2be |
3 files changed, 25 insertions(+), 24 deletions(-)
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
|
|
Takashi Iwai |
f9a2be |
index 94c65def102c..470ff0ce3dc7 100644
|
|
Takashi Iwai |
f9a2be |
--- a/net/mac80211/agg-rx.c
|
|
Takashi Iwai |
f9a2be |
+++ b/net/mac80211/agg-rx.c
|
|
Takashi Iwai |
f9a2be |
@@ -498,13 +498,14 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
|
|
Takashi Iwai |
f9a2be |
elems = ieee802_11_parse_elems(mgmt->u.action.u.addba_req.variable,
|
|
Takashi Iwai |
f9a2be |
ies_len, true, mgmt->bssid, NULL);
|
|
Takashi Iwai |
f9a2be |
if (!elems || elems->parse_error)
|
|
Takashi Iwai |
f9a2be |
- return;
|
|
Takashi Iwai |
f9a2be |
+ goto free;
|
|
Takashi Iwai |
f9a2be |
}
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
__ieee80211_start_rx_ba_session(sta, dialog_token, timeout,
|
|
Takashi Iwai |
f9a2be |
start_seq_num, ba_policy, tid,
|
|
Takashi Iwai |
f9a2be |
buf_size, true, false,
|
|
Takashi Iwai |
f9a2be |
elems ? elems->addba_ext_ie : NULL);
|
|
Takashi Iwai |
f9a2be |
+free:
|
|
Takashi Iwai |
f9a2be |
kfree(elems);
|
|
Takashi Iwai |
f9a2be |
}
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
|
|
Takashi Iwai |
f9a2be |
index 66b00046f0c2..0416c4d22292 100644
|
|
Takashi Iwai |
f9a2be |
--- a/net/mac80211/ibss.c
|
|
Takashi Iwai |
f9a2be |
+++ b/net/mac80211/ibss.c
|
|
Takashi Iwai |
f9a2be |
@@ -1659,11 +1659,11 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|
Takashi Iwai |
f9a2be |
mgmt->u.action.u.chan_switch.variable,
|
|
Takashi Iwai |
f9a2be |
ies_len, true, mgmt->bssid, NULL);
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
- if (!elems || elems->parse_error)
|
|
Takashi Iwai |
f9a2be |
- break;
|
|
Takashi Iwai |
f9a2be |
-
|
|
Takashi Iwai |
f9a2be |
- ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt, skb->len,
|
|
Takashi Iwai |
f9a2be |
- rx_status, elems);
|
|
Takashi Iwai |
f9a2be |
+ if (elems && !elems->parse_error)
|
|
Takashi Iwai |
f9a2be |
+ ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt,
|
|
Takashi Iwai |
f9a2be |
+ skb->len,
|
|
Takashi Iwai |
f9a2be |
+ rx_status,
|
|
Takashi Iwai |
f9a2be |
+ elems);
|
|
Takashi Iwai |
f9a2be |
kfree(elems);
|
|
Takashi Iwai |
f9a2be |
break;
|
|
Takashi Iwai |
f9a2be |
}
|
|
Takashi Iwai |
f9a2be |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
|
|
Takashi Iwai |
f9a2be |
index 0ec183a92a01..40b29cfb7cfe 100644
|
|
Takashi Iwai |
f9a2be |
--- a/net/mac80211/mlme.c
|
|
Takashi Iwai |
f9a2be |
+++ b/net/mac80211/mlme.c
|
|
Takashi Iwai |
f9a2be |
@@ -3353,8 +3353,10 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
|
|
Takashi Iwai |
f9a2be |
bss_ies = kmemdup(ies, sizeof(*ies) + ies->len,
|
|
Takashi Iwai |
f9a2be |
GFP_ATOMIC);
|
|
Takashi Iwai |
f9a2be |
rcu_read_unlock();
|
|
Takashi Iwai |
f9a2be |
- if (!bss_ies)
|
|
Takashi Iwai |
f9a2be |
- return false;
|
|
Takashi Iwai |
f9a2be |
+ if (!bss_ies) {
|
|
Takashi Iwai |
f9a2be |
+ ret = false;
|
|
Takashi Iwai |
f9a2be |
+ goto out;
|
|
Takashi Iwai |
f9a2be |
+ }
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
bss_elems = ieee802_11_parse_elems(bss_ies->data, bss_ies->len,
|
|
Takashi Iwai |
f9a2be |
false, mgmt->bssid,
|
|
Takashi Iwai |
f9a2be |
@@ -4331,13 +4333,11 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|
Takashi Iwai |
f9a2be |
mgmt->u.action.u.chan_switch.variable,
|
|
Takashi Iwai |
f9a2be |
ies_len, true, mgmt->bssid, NULL);
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
- if (!elems || elems->parse_error)
|
|
Takashi Iwai |
f9a2be |
- break;
|
|
Takashi Iwai |
f9a2be |
-
|
|
Takashi Iwai |
f9a2be |
- ieee80211_sta_process_chanswitch(sdata,
|
|
Takashi Iwai |
f9a2be |
- rx_status->mactime,
|
|
Takashi Iwai |
f9a2be |
- rx_status->device_timestamp,
|
|
Takashi Iwai |
f9a2be |
- elems, false);
|
|
Takashi Iwai |
f9a2be |
+ if (elems && !elems->parse_error)
|
|
Takashi Iwai |
f9a2be |
+ ieee80211_sta_process_chanswitch(sdata,
|
|
Takashi Iwai |
f9a2be |
+ rx_status->mactime,
|
|
Takashi Iwai |
f9a2be |
+ rx_status->device_timestamp,
|
|
Takashi Iwai |
f9a2be |
+ elems, false);
|
|
Takashi Iwai |
f9a2be |
kfree(elems);
|
|
Takashi Iwai |
f9a2be |
} else if (mgmt->u.action.category == WLAN_CATEGORY_PUBLIC) {
|
|
Takashi Iwai |
f9a2be |
struct ieee802_11_elems *elems;
|
|
Takashi Iwai |
f9a2be |
@@ -4357,17 +4357,17 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|
Takashi Iwai |
f9a2be |
mgmt->u.action.u.ext_chan_switch.variable,
|
|
Takashi Iwai |
f9a2be |
ies_len, true, mgmt->bssid, NULL);
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
- if (!elems || elems->parse_error)
|
|
Takashi Iwai |
f9a2be |
- break;
|
|
Takashi Iwai |
f9a2be |
+ if (elems && !elems->parse_error) {
|
|
Takashi Iwai |
f9a2be |
+ /* for the handling code pretend it was an IE */
|
|
Takashi Iwai |
f9a2be |
+ elems->ext_chansw_ie =
|
|
Takashi Iwai |
f9a2be |
+ &mgmt->u.action.u.ext_chan_switch.data;
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
- /* for the handling code pretend this was also an IE */
|
|
Takashi Iwai |
f9a2be |
- elems->ext_chansw_ie =
|
|
Takashi Iwai |
f9a2be |
- &mgmt->u.action.u.ext_chan_switch.data;
|
|
Takashi Iwai |
f9a2be |
+ ieee80211_sta_process_chanswitch(sdata,
|
|
Takashi Iwai |
f9a2be |
+ rx_status->mactime,
|
|
Takashi Iwai |
f9a2be |
+ rx_status->device_timestamp,
|
|
Takashi Iwai |
f9a2be |
+ elems, false);
|
|
Takashi Iwai |
f9a2be |
+ }
|
|
Takashi Iwai |
f9a2be |
|
|
Takashi Iwai |
f9a2be |
- ieee80211_sta_process_chanswitch(sdata,
|
|
Takashi Iwai |
f9a2be |
- rx_status->mactime,
|
|
Takashi Iwai |
f9a2be |
- rx_status->device_timestamp,
|
|
Takashi Iwai |
f9a2be |
- elems, false);
|
|
Takashi Iwai |
f9a2be |
kfree(elems);
|
|
Takashi Iwai |
f9a2be |
}
|
|
Takashi Iwai |
f9a2be |
break;
|
|
Takashi Iwai |
f9a2be |
--
|
|
Takashi Iwai |
f9a2be |
2.35.3
|
|
Takashi Iwai |
f9a2be |
|