FAILED: patch "[PATCH] ath10k: drop fragments with multicast DA for PCIe" failed to apply to 4.9-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 65c415a144ad8132b6a6d97d4a1919ffc728e2d1 Mon Sep 17 00:00:00 2001
From: Wen Gong <[email protected]>
Date: Tue, 11 May 2021 20:02:53 +0200
Subject: [PATCH] ath10k: drop fragments with multicast DA for PCIe
Fragmentation is not used with multicast frames. Discard unexpected fragments with multicast DA. This fixes CVE-2020-26145.
Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00110-QCARMSWP-1
Signed-off-by Wen Gong <[email protected]>
Signed-off-by Jouni Malinen <[email protected]>
Link https://lore.kernel.org/r/20210511200110.5a0bd289bda8.Idd6ebea20038fb1cfee6de924aa595e5647c9eae@changeid open here
Signed-off-by Johannes Berg <[email protected]>
drivers/net/wireless/ath/ath10k/htt_rx.c +20 -3
@@ -1768,6 +1768,16 @@ static u64 ath10k_htt_rx_h_get_pn(struct ath10k *ar, struct sk_buff *skb,return pn; } +static bool ath10k_htt_rx_h_frag_multicast_check (struct ath10k *ar, +struct sk_buff *skb, +u16 offset) +{ +struct ieee80211_hdr *hdr; + + hdr = (struct ieee80211_hdr *)(skb->data + offset); +return !is_multicast_ether_addr (hdr->addr1); +} + static bool ath10k_htt_rx_h_frag_pn_check(struct ath10k *ar, struct sk_buff *skb, u16 peer_id,
@@ -1839,7 +1849,7 @@ static void ath10k_htt_rx_h_mpdu(struct ath10k *ar,bool is_decrypted;bool is_mgmt;u32 attention; -bool frag_pn_check = true; +bool frag_pn_check = true, multicast_check = true;if (skb_queue_empty (amsdu))return ;
@@ -1946,13 +1956,20 @@ static void ath10k_htt_rx_h_mpdu(struct ath10k *ar,0 , enctype); -if (!frag_pn_check) { -/* Discard the fragment with invalid PN */ +if (frag) + multicast_check =ath10k_htt_rx_h_frag_multicast_check (ar, + msdu, +0 ); + +if (!frag_pn_check || !multicast_check) { +/* Discard the fragment with invalid PN or multicast DA +*/ temp = msdu->prev;__skb_unlink (msdu, amsdu);dev_kfree_skb_any (msdu); msdu = temp; frag_pn_check = true; + multicast_check = true;continue ; }