Patch "mac80211: strictly check mesh address extension mode" has been added to the 4.11-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mac80211: strictly check mesh address extension mode
to the 4.11-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mac80211-strictly-check-mesh-address-extension-mode.patch
and it can be found in the queue-4.11 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
5667c86acf021e6dcf02584408b4484a273ac68fMon Sep 17 00:00:00 2001
From: Rajkumar Manoharan <[email protected]>
Date: Sun, 14 May 2017 21:41:55 -0700
Subject: mac80211: strictly check mesh address extension mode
From: Rajkumar Manoharan <[email protected]>
commit 5667c86acf021e6dcf02584408b4484a273ac68f upstream.
Mesh forwarding path checks for address extension mode to fetch appropriate proxied address and MPP address. Existing condition that looks for 6 address format is not strict enough so that frames with improper values are processed and invalid entries are added into MPP table. Fix that by adding a stricter check before processing the packet.
Per IEEE Std 802.11s-2011 spec. Table 7-6g1 lists address extension mode 0x3 as reserved one. And also Table Table 9-13 does not specify 0x3 as valid address field.
--- net/mac80211/rx.c | 3 ++- net/wireless/util.c | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-)
net/mac80211/rx.c +2 -1
@@ -2470,7 +2470,8 @@ ieee80211_rx_h_mesh_fwding(struct ieee80if (is_multicast_ether_addr (hdr->addr1)) { mpp_addr = hdr->addr3; proxied_addr = mesh_hdr->eaddr1; - }else if (mesh_hdr->flags &MESH_FLAGS_AE_A5_A6 ) { + }else if ((mesh_hdr->flags &MESH_FLAGS_AE ) == +MESH_FLAGS_AE_A5_A6 ) {/* has_a4 already checked in ieee80211_rx_mesh_check */ mpp_addr = hdr->addr4; proxied_addr = mesh_hdr->eaddr2;
net/wireless/util.c +6 -4
@@ -454,6 +454,8 @@ int ieee80211_data_to_8023_exthdr(structif (iftype ==NL80211_IFTYPE_MESH_POINT )skb_copy_bits (skb, hdrlen, &mesh_flags,1 ); + mesh_flags &=MESH_FLAGS_AE ; +switch (hdr->frame_control &cpu_to_le16 (IEEE80211_FCTL_TODS |IEEE80211_FCTL_FROMDS )) {case cpu_to_le16 (IEEE80211_FCTL_TODS ):
@@ -469,9 +471,9 @@ int ieee80211_data_to_8023_exthdr(struct iftype != NL80211_IFTYPE_STATION))return -1 ;if (iftype ==NL80211_IFTYPE_MESH_POINT ) { -if (mesh_flags &MESH_FLAGS_AE_A4 ) +if (mesh_flags ==MESH_FLAGS_AE_A4 )return -1 ; -if (mesh_flags &MESH_FLAGS_AE_A5_A6 ) { +if (mesh_flags ==MESH_FLAGS_AE_A5_A6 ) {skb_copy_bits (skb, hdrlen + offsetof(struct ieee80211s_hdr , eaddr1), tmp.h_dest,2 *ETH_ALEN );
@@ -487,9 +489,9 @@ int ieee80211_data_to_8023_exthdr(struct ether_addr_equal(tmp.h_source, addr)))return -1 ;if (iftype ==NL80211_IFTYPE_MESH_POINT ) { -if (mesh_flags &MESH_FLAGS_AE_A5_A6 ) +if (mesh_flags ==MESH_FLAGS_AE_A5_A6 )return -1 ; -if (mesh_flags &MESH_FLAGS_AE_A4 ) +if (mesh_flags ==MESH_FLAGS_AE_A4 )skb_copy_bits (skb, hdrlen + offsetof(struct ieee80211s_hdr , eaddr1), tmp.h_source,ETH_ALEN );
Patches currently in stable-queue which might be from [email protected] are
queue-4.11/mac80211-strictly-check-mesh-address-extension-mode.patch