diff options
author | Felix Fietkau <nbd@nbd.name> | 2020-10-16 21:42:11 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2020-10-17 16:43:17 +0200 |
commit | 08a42ef057b0c1c31d66358f29376b939487c732 (patch) | |
tree | c7bc580991ea312d1dc252cd850ad7d7d1e301aa /package/kernel | |
parent | e17529a3e3261dbc83c31d27f939a91b065ebe36 (diff) | |
download | upstream-08a42ef057b0c1c31d66358f29376b939487c732.tar.gz upstream-08a42ef057b0c1c31d66358f29376b939487c732.tar.bz2 upstream-08a42ef057b0c1c31d66358f29376b939487c732.zip |
mac80211: fix memory leak on filtered powersave frames
After the status rework, ieee80211_tx_status_ext is leaking un-acknowledged
packets for stations in powersave mode.
To fix this, move the code handling those packets from __ieee80211_tx_status
into ieee80211_tx_status_ext
Reported-by: Tobias Waldvogel <tobias.waldvogel@gmail.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'package/kernel')
-rw-r--r-- | package/kernel/mac80211/patches/subsys/333-mac80211-fix-memory-leak-on-filtered-powersave-frame.patch | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/subsys/333-mac80211-fix-memory-leak-on-filtered-powersave-frame.patch b/package/kernel/mac80211/patches/subsys/333-mac80211-fix-memory-leak-on-filtered-powersave-frame.patch new file mode 100644 index 0000000000..cdbbcf5d06 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/333-mac80211-fix-memory-leak-on-filtered-powersave-frame.patch @@ -0,0 +1,55 @@ +From: Felix Fietkau <nbd@nbd.name> +Date: Fri, 16 Oct 2020 19:54:49 +0200 +Subject: [PATCH] mac80211: fix memory leak on filtered powersave frames + +After the status rework, ieee80211_tx_status_ext is leaking un-acknowledged +packets for stations in powersave mode. +To fix this, move the code handling those packets from __ieee80211_tx_status +into ieee80211_tx_status_ext + +Reported-by: Tobias Waldvogel <tobias.waldvogel@gmail.com> +Fixes: 3318111cf63d ("mac80211: reduce duplication in tx status functions") +Signed-off-by: Felix Fietkau <nbd@nbd.name> +--- + +--- a/net/mac80211/status.c ++++ b/net/mac80211/status.c +@@ -49,7 +49,8 @@ static void ieee80211_handle_filtered_fr + int ac; + + if (info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER | +- IEEE80211_TX_CTL_AMPDU)) { ++ IEEE80211_TX_CTL_AMPDU | ++ IEEE80211_TX_CTL_HW_80211_ENCAP)) { + ieee80211_free_txskb(&local->hw, skb); + return; + } +@@ -924,15 +925,6 @@ static void __ieee80211_tx_status(struct + ieee80211_mpsp_trigger_process( + ieee80211_get_qos_ctl(hdr), sta, true, acked); + +- if (!acked && test_sta_flag(sta, WLAN_STA_PS_STA)) { +- /* +- * The STA is in power save mode, so assume +- * that this TX packet failed because of that. +- */ +- ieee80211_handle_filtered_frame(local, sta, skb); +- return; +- } +- + if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) && + (ieee80211_is_data(hdr->frame_control)) && + (rates_idx != -1)) +@@ -1159,6 +1151,12 @@ void ieee80211_tx_status_ext(struct ieee + -info->status.ack_signal); + } + } else if (test_sta_flag(sta, WLAN_STA_PS_STA)) { ++ /* ++ * The STA is in power save mode, so assume ++ * that this TX packet failed because of that. ++ */ ++ if (skb) ++ ieee80211_handle_filtered_frame(local, sta, skb); + return; + } else if (noack_success) { + /* nothing to do here, do not account as lost */ |