developer | 33907d4 | 2022-09-19 14:33:58 +0800 | [diff] [blame^] | 1 | From 552ba102a6898630a7d16887f29e606d6fabe508 Mon Sep 17 00:00:00 2001 |
| 2 | From: Siddh Raman Pant <code@siddh.me> |
| 3 | Date: Sun, 14 Aug 2022 20:45:12 +0530 |
| 4 | Subject: [PATCH] wifi: mac80211: Don't finalize CSA in IBSS mode if state is |
| 5 | disconnected |
| 6 | |
| 7 | commit 15bc8966b6d3a5b9bfe4c9facfa02f2b69b1e5f0 upstream. |
| 8 | |
| 9 | When we are not connected to a channel, sending channel "switch" |
| 10 | announcement doesn't make any sense. |
| 11 | |
| 12 | The BSS list is empty in that case. This causes the for loop in |
| 13 | cfg80211_get_bss() to be bypassed, so the function returns NULL |
| 14 | (check line 1424 of net/wireless/scan.c), causing the WARN_ON() |
| 15 | in ieee80211_ibss_csa_beacon() to get triggered (check line 500 |
| 16 | of net/mac80211/ibss.c), which was consequently reported on the |
| 17 | syzkaller dashboard. |
| 18 | |
| 19 | Thus, check if we have an existing connection before generating |
| 20 | the CSA beacon in ieee80211_ibss_finish_csa(). |
| 21 | |
| 22 | Cc: stable@vger.kernel.org |
| 23 | Fixes: cd7760e62c2a ("mac80211: add support for CSA in IBSS mode") |
| 24 | Link: https://syzkaller.appspot.com/bug?id=05603ef4ae8926761b678d2939a3b2ad28ab9ca6 |
| 25 | Reported-by: syzbot+b6c9fe29aefe68e4ad34@syzkaller.appspotmail.com |
| 26 | Signed-off-by: Siddh Raman Pant <code@siddh.me> |
| 27 | Tested-by: syzbot+b6c9fe29aefe68e4ad34@syzkaller.appspotmail.com |
| 28 | Link: https://lore.kernel.org/r/20220814151512.9985-1-code@siddh.me |
| 29 | Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| 30 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| 31 | --- |
| 32 | net/mac80211/ibss.c | 4 ++++ |
| 33 | 1 file changed, 4 insertions(+) |
| 34 | |
| 35 | --- a/net/mac80211/ibss.c |
| 36 | +++ b/net/mac80211/ibss.c |
| 37 | @@ -534,6 +534,10 @@ int ieee80211_ibss_finish_csa(struct iee |
| 38 | |
| 39 | sdata_assert_lock(sdata); |
| 40 | |
| 41 | + /* When not connected/joined, sending CSA doesn't make sense. */ |
| 42 | + if (ifibss->state != IEEE80211_IBSS_MLME_JOINED) |
| 43 | + return -ENOLINK; |
| 44 | + |
| 45 | /* update cfg80211 bss information with the new channel */ |
| 46 | if (!is_zero_ether_addr(ifibss->bssid)) { |
| 47 | cbss = cfg80211_get_bss(sdata->local->hw.wiphy, |