Skip to content

Commit d05fbef

Browse files
1054009064nbd168
andauthored
mac80211: backport security fixes (#10324)
* mac80211: backport security fixes This mainly affects scanning and beacon parsing, especially with MBSSID enabled Fixes: CVE-2022-41674 Fixes: CVE-2022-42719 Fixes: CVE-2022-42720 Fixes: CVE-2022-42721 Fixes: CVE-2022-42722 Signed-off-by: Felix Fietkau <[email protected]> (cherry-picked from commit 26f4002) * mac80211: refresh patches 355-wifi-cfg80211-fix-BSS-refcounting-bugs.patch - gregkh/linux@5a52384 Co-authored-by: Felix Fietkau <[email protected]> Co-authored-by: 1054009064 <[email protected]>
1 parent 99b245d commit d05fbef

File tree

31 files changed

+2130
-155
lines changed

31 files changed

+2130
-155
lines changed

package/kernel/mac80211/patches/ath10k/991-ath10k-5.19.patch

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
--- a/drivers/net/wireless/ath/ath10k/core.c
22
+++ b/drivers/net/wireless/ath/ath10k/core.c
3-
@@ -3333,7 +3333,11 @@
3+
@@ -3333,7 +3333,11 @@ static int ath10k_core_probe_fw(struct a
44
ath10k_debug_print_board_info(ar);
55
}
66

Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
2-
index 44a11b0..178e692 100644
31
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
42
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
5-
@@ -245,7 +245,11 @@
3+
@@ -245,7 +245,11 @@ static int brcmf_netdev_set_mac_address(
64
} else {
75
brcmf_dbg(TRACE, "updated to %pM\n", sa->sa_data);
86
memcpy(ifp->mac_addr, sa->sa_data, ETH_ALEN);
@@ -14,53 +12,51 @@ index 44a11b0..178e692 100644
1412
}
1513
return err;
1614
}
17-
@@ -424,6 +428,7 @@
15+
@@ -424,6 +428,7 @@ void brcmf_netif_rx(struct brcmf_if *ifp
1816
ifp->ndev->stats.rx_packets++;
19-
17+
2018
brcmf_dbg(DATA, "rx proto=0x%X\n", ntohs(skb->protocol));
2119
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
2220
if (inirq) {
2321
netif_rx(skb);
2422
} else {
25-
@@ -433,6 +438,9 @@
23+
@@ -433,6 +438,9 @@ void brcmf_netif_rx(struct brcmf_if *ifp
2624
*/
2725
netif_rx_ni(skb);
2826
}
2927
+#else
3028
+ netif_rx(skb);
3129
+#endif
3230
}
33-
31+
3432
void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb)
35-
@@ -673,7 +681,11 @@
33+
@@ -673,7 +681,11 @@ int brcmf_net_attach(struct brcmf_if *if
3634
ndev->ethtool_ops = &brcmf_ethtool_ops;
37-
35+
3836
/* set the mac address & netns */
3937
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
4038
memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
4139
+#else
4240
+ eth_hw_addr_set(ifp->ndev, ifp->mac_addr);
4341
+#endif
4442
dev_net_set(ndev, wiphy_net(cfg_to_wiphy(drvr->config)));
45-
43+
4644
INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
47-
@@ -848,7 +860,11 @@
45+
@@ -848,7 +860,11 @@ static int brcmf_net_p2p_attach(struct b
4846
ndev->netdev_ops = &brcmf_netdev_ops_p2p;
49-
47+
5048
/* set the mac address */
5149
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
5250
memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
5351
+#else
5452
+ eth_hw_addr_set(ndev, ifp->mac_addr);
5553
+#endif
56-
54+
5755
if (register_netdev(ndev) != 0) {
5856
bphy_err(drvr, "couldn't register the p2p net device\n");
59-
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
60-
index 9ac0d8c..4735063 100644
6157
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
6258
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
63-
@@ -2125,7 +2125,7 @@ static int brcmf_p2p_disable_p2p_if(struct brcmf_cfg80211_vif *vif)
59+
@@ -2125,7 +2125,7 @@ static int brcmf_p2p_disable_p2p_if(stru
6460
struct brcmf_cfg80211_info *cfg = wdev_to_cfg(&vif->wdev);
6561
struct net_device *pri_ndev = cfg_to_ndev(cfg);
6662
struct brcmf_if *ifp = netdev_priv(pri_ndev);
@@ -69,7 +65,7 @@ index 9ac0d8c..4735063 100644
6965

7066
return brcmf_fil_iovar_data_set(ifp, "p2p_ifdis", addr, ETH_ALEN);
7167
}
72-
@@ -2135,7 +2135,7 @@ static int brcmf_p2p_release_p2p_if(struct brcmf_cfg80211_vif *vif)
68+
@@ -2135,7 +2135,7 @@ static int brcmf_p2p_release_p2p_if(stru
7369
struct brcmf_cfg80211_info *cfg = wdev_to_cfg(&vif->wdev);
7470
struct net_device *pri_ndev = cfg_to_ndev(cfg);
7571
struct brcmf_if *ifp = netdev_priv(pri_ndev);
@@ -78,11 +74,9 @@ index 9ac0d8c..4735063 100644
7874

7975
return brcmf_fil_iovar_data_set(ifp, "p2p_ifdel", addr, ETH_ALEN);
8076
}
81-
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
82-
index 8effeb7..04362e2 100644
8377
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
8478
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
85-
@@ -4164,7 +4164,11 @@
79+
@@ -4164,7 +4164,11 @@ static int brcmf_sdio_bus_reset(struct d
8680

8781
/* reset the adapter */
8882
sdio_claim_host(sdiodev->func1);
@@ -94,8 +88,6 @@ index 8effeb7..04362e2 100644
9488
sdio_release_host(sdiodev->func1);
9589

9690
brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN);
97-
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
98-
index ab83553..7941d28 100644
9991
--- a/include/net/cfg80211.h
10092
+++ b/include/net/cfg80211.h
10193
@@ -5555,7 +5555,7 @@ struct wireless_dev {
@@ -107,11 +99,9 @@ index ab83553..7941d28 100644
10799
{
108100
if (wdev->netdev)
109101
return wdev->netdev->dev_addr;
110-
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
111-
index 57aa863..f5ebb5a 100644
112102
--- a/net/mac80211/iface.c
113103
+++ b/net/mac80211/iface.c
114-
@@ -1274,9 +1274,13 @@
104+
@@ -1274,9 +1274,13 @@ int ieee80211_do_open(struct wireless_de
115105
* this interface, if it has the special null one.
116106
*/
117107
if (dev && is_zero_ether_addr(dev->dev_addr)) {
@@ -123,10 +113,10 @@ index 57aa863..f5ebb5a 100644
123113
+ eth_hw_addr_set(dev, local->hw.wiphy->perm_addr);
124114
+#endif
125115
memcpy(dev->perm_addr, dev->dev_addr, ETH_ALEN);
126-
116+
127117
if (!is_valid_ether_addr(dev->dev_addr)) {
128-
@@ -2136,9 +2140,17 @@
129-
118+
@@ -2136,9 +2140,17 @@ int ieee80211_if_add(struct ieee80211_lo
119+
130120
ieee80211_assign_perm_addr(local, ndev->perm_addr, type);
131121
if (is_valid_ether_addr(params->macaddr))
132122
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
@@ -141,5 +131,5 @@ index 57aa863..f5ebb5a 100644
141131
+ eth_hw_addr_set(ndev, ndev->perm_addr);
142132
+#endif
143133
SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy));
144-
134+
145135
/* don't use IEEE80211_DEV_TO_SUB_IF -- it checks too much */

package/kernel/mac80211/patches/build/267-rtl8723_5.18_support.patch

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--- a/drivers/staging/rtl8723bs/include/osdep_service_linux.h
2-
+++ a/drivers/staging/rtl8723bs/include/osdep_service_linux.h
2+
+++ b/drivers/staging/rtl8723bs/include/osdep_service_linux.h
33
@@ -45,7 +45,11 @@
44
spinlock_t lock;
55
};

package/kernel/mac80211/patches/build/882-use-netif_rx.patch

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
--- a/net/wireless/util.c
22
+++ b/net/wireless/util.c
3-
@@ -2149,7 +2149,11 @@
3+
@@ -2149,7 +2149,11 @@ void cfg80211_send_layer2_update(struct
44
skb->dev = dev;
55
skb->protocol = eth_type_trans(skb, dev);
66
memset(skb->cb, 0, sizeof(skb->cb));
@@ -11,4 +11,4 @@
1111
+#endif
1212
}
1313
EXPORT_SYMBOL(cfg80211_send_layer2_update);
14-
14+

package/kernel/mac80211/patches/rt2x00/999-backport-to-linux-5.18.patch

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
22
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
3-
@@ -586,10 +586,18 @@ static void rt2x00usb_assign_endpoint(struct data_queue *queue,
3+
@@ -586,10 +586,18 @@ static void rt2x00usb_assign_endpoint(st
44

55
if (queue->qid == QID_RX) {
66
pipe = usb_rcvbulkpipe(usb_dev, queue->usb_endpoint);

package/kernel/mac80211/patches/rtl/001-rtw88-Call-rtw_fw_beacon_filter_config-with-rtwdev--mutex-held.patch

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
2-
index 5cdc54c9a9aae..3c07485d6ba47 100644
31
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
42
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
5-
@@ -466,8 +466,8 @@ static int rtw_ops_sta_remove(struct ieee80211_hw *hw,
3+
@@ -455,8 +455,8 @@ static int rtw_ops_sta_remove(struct iee
64
{
75
struct rtw_dev *rtwdev = hw->priv;
86

package/kernel/mac80211/patches/rtl/002-rtw88-Drop-rf_lock.patch

+8-16
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
2-
index 1a52ff585fbc7..ba5ba852efb8c 100644
31
--- a/drivers/net/wireless/realtek/rtw88/debug.c
42
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
5-
@@ -144,7 +144,9 @@ static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v)
3+
@@ -143,7 +143,9 @@ static int rtw_debugfs_get_rf_read(struc
64
addr = debugfs_priv->rf_addr;
75
mask = debugfs_priv->rf_mask;
86

@@ -12,7 +10,7 @@ index 1a52ff585fbc7..ba5ba852efb8c 100644
1210

1311
seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n",
1412
path, addr, mask, val);
15-
@@ -418,7 +420,9 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp,
13+
@@ -401,7 +403,9 @@ static ssize_t rtw_debugfs_set_rf_write(
1614
return count;
1715
}
1816

@@ -22,7 +20,7 @@ index 1a52ff585fbc7..ba5ba852efb8c 100644
2220
rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
2321
"write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n",
2422
path, addr, mask, val);
25-
@@ -523,6 +527,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
23+
@@ -481,6 +485,8 @@ static int rtw_debug_get_rf_dump(struct
2624
u32 addr, offset, data;
2725
u8 path;
2826

@@ -31,7 +29,7 @@ index 1a52ff585fbc7..ba5ba852efb8c 100644
3129
for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
3230
seq_printf(m, "RF path:%d\n", path);
3331
for (addr = 0; addr < 0x100; addr += 4) {
34-
@@ -537,6 +543,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
32+
@@ -495,6 +501,8 @@ static int rtw_debug_get_rf_dump(struct
3533
seq_puts(m, "\n");
3634
}
3735

@@ -40,7 +38,7 @@ index 1a52ff585fbc7..ba5ba852efb8c 100644
4038
return 0;
4139
}
4240

43-
@@ -1027,6 +1035,8 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m)
41+
@@ -911,6 +919,8 @@ static void dump_gapk_status(struct rtw_
4442
dm_info->dm_flags & BIT(RTW_DM_CAP_TXGAPK) ? '-' : '+',
4543
rtw_dm_cap_strs[RTW_DM_CAP_TXGAPK]);
4644

@@ -49,16 +47,14 @@ index 1a52ff585fbc7..ba5ba852efb8c 100644
4947
for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
5048
val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK);
5149
seq_printf(m, "path %d:\n0x%x = 0x%x\n", path, RF_GAINTX, val);
52-
@@ -1036,6 +1046,7 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m)
50+
@@ -920,6 +930,7 @@ static void dump_gapk_status(struct rtw_
5351
txgapk->rf3f_fs[path][i], i);
5452
seq_puts(m, "\n");
5553
}
5654
+ mutex_unlock(&rtwdev->mutex);
5755
}
5856

5957
static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v)
60-
diff --git a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/realtek/rtw88/hci.h
61-
index 4c6fc6fb3f83b..830d7532f2a35 100644
6258
--- a/drivers/net/wireless/realtek/rtw88/hci.h
6359
+++ b/drivers/net/wireless/realtek/rtw88/hci.h
6460
@@ -166,12 +166,11 @@ static inline u32
@@ -89,23 +85,19 @@ index 4c6fc6fb3f83b..830d7532f2a35 100644
8985
}
9086

9187
static inline u32
92-
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
93-
index 8b9899e41b0bb..f9864840ffd9c 100644
9488
--- a/drivers/net/wireless/realtek/rtw88/main.c
9589
+++ b/drivers/net/wireless/realtek/rtw88/main.c
96-
@@ -1994,7 +1994,6 @@ int rtw_core_init(struct rtw_dev *rtwdev)
90+
@@ -1839,7 +1839,6 @@ int rtw_core_init(struct rtw_dev *rtwdev
9791
skb_queue_head_init(&rtwdev->coex.queue);
9892
skb_queue_head_init(&rtwdev->tx_report.queue);
9993

10094
- spin_lock_init(&rtwdev->rf_lock);
10195
spin_lock_init(&rtwdev->h2c.lock);
10296
spin_lock_init(&rtwdev->txq_lock);
10397
spin_lock_init(&rtwdev->tx_report.q_lock);
104-
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
105-
index 17815af9dd4ea..df6c6032bbd3b 100644
10698
--- a/drivers/net/wireless/realtek/rtw88/main.h
10799
+++ b/drivers/net/wireless/realtek/rtw88/main.h
108-
@@ -1994,9 +1994,6 @@ struct rtw_dev {
100+
@@ -1842,9 +1842,6 @@ struct rtw_dev {
109101
/* ensures exclusive access from mac80211 callbacks */
110102
struct mutex mutex;
111103

package/kernel/mac80211/patches/rtl/003-rtw88-Drop-h2c.lock.patch

+8-16
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
2-
index ba5ba852efb8c..79939aa6b752c 100644
31
--- a/drivers/net/wireless/realtek/rtw88/debug.c
42
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
5-
@@ -396,7 +396,9 @@ static ssize_t rtw_debugfs_set_h2c(struct file *filp,
3+
@@ -379,7 +379,9 @@ static ssize_t rtw_debugfs_set_h2c(struc
64
return -EINVAL;
75
}
86

@@ -12,11 +10,9 @@ index ba5ba852efb8c..79939aa6b752c 100644
1210

1311
return count;
1412
}
15-
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
16-
index aa2aeb5fb2ccd..c3ad2a1b47212 100644
1713
--- a/drivers/net/wireless/realtek/rtw88/fw.c
1814
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
19-
@@ -320,7 +320,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
15+
@@ -285,7 +285,7 @@ static void rtw_fw_send_h2c_command(stru
2016
h2c[3], h2c[2], h2c[1], h2c[0],
2117
h2c[7], h2c[6], h2c[5], h2c[4]);
2218

@@ -25,7 +21,7 @@ index aa2aeb5fb2ccd..c3ad2a1b47212 100644
2521

2622
box = rtwdev->h2c.last_box_num;
2723
switch (box) {
28-
@@ -342,7 +342,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
24+
@@ -307,7 +307,7 @@ static void rtw_fw_send_h2c_command(stru
2925
break;
3026
default:
3127
WARN(1, "invalid h2c mail box number\n");
@@ -34,7 +30,7 @@ index aa2aeb5fb2ccd..c3ad2a1b47212 100644
3430
}
3531

3632
ret = read_poll_timeout_atomic(rtw_read8, box_state,
37-
@@ -351,7 +351,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
33+
@@ -316,7 +316,7 @@ static void rtw_fw_send_h2c_command(stru
3834

3935
if (ret) {
4036
rtw_err(rtwdev, "failed to send h2c command\n");
@@ -43,7 +39,7 @@ index aa2aeb5fb2ccd..c3ad2a1b47212 100644
4339
}
4440

4541
for (idx = 0; idx < 4; idx++)
46-
@@ -361,9 +361,6 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
42+
@@ -326,9 +326,6 @@ static void rtw_fw_send_h2c_command(stru
4743

4844
if (++rtwdev->h2c.last_box_num >= 4)
4945
rtwdev->h2c.last_box_num = 0;
@@ -53,7 +49,7 @@ index aa2aeb5fb2ccd..c3ad2a1b47212 100644
5349
}
5450

5551
void rtw_fw_h2c_cmd_dbg(struct rtw_dev *rtwdev, u8 *h2c)
56-
@@ -375,15 +372,13 @@ static void rtw_fw_send_h2c_packet(struct rtw_dev *rtwdev, u8 *h2c_pkt)
52+
@@ -340,15 +337,13 @@ static void rtw_fw_send_h2c_packet(struc
5753
{
5854
int ret;
5955

@@ -70,23 +66,19 @@ index aa2aeb5fb2ccd..c3ad2a1b47212 100644
7066
}
7167

7268
void
73-
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
74-
index f9864840ffd9c..baf4d29fde678 100644
7569
--- a/drivers/net/wireless/realtek/rtw88/main.c
7670
+++ b/drivers/net/wireless/realtek/rtw88/main.c
77-
@@ -1994,7 +1994,6 @@ int rtw_core_init(struct rtw_dev *rtwdev)
71+
@@ -1839,7 +1839,6 @@ int rtw_core_init(struct rtw_dev *rtwdev
7872
skb_queue_head_init(&rtwdev->coex.queue);
7973
skb_queue_head_init(&rtwdev->tx_report.queue);
8074

8175
- spin_lock_init(&rtwdev->h2c.lock);
8276
spin_lock_init(&rtwdev->txq_lock);
8377
spin_lock_init(&rtwdev->tx_report.q_lock);
8478

85-
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
86-
index df6c6032bbd3b..619ee6e8d2807 100644
8779
--- a/drivers/net/wireless/realtek/rtw88/main.h
8880
+++ b/drivers/net/wireless/realtek/rtw88/main.h
89-
@@ -2018,8 +2018,6 @@ struct rtw_dev {
81+
@@ -1865,8 +1865,6 @@ struct rtw_dev {
9082
struct {
9183
/* incicate the mail box to use with fw */
9284
u8 last_box_num;

0 commit comments

Comments
 (0)