Skip to content

Commit a1b8015

Browse files
Po-Hao HuangKalle Valo
authored andcommitted
wifi: rtw88: prevent scan abort with other VIFs
Only abort scan with current scanning VIF. If we have more than one interface, we could call rtw_hw_scan_abort() with the wrong VIF as input. This avoids potential null pointer being accessed when actually the other VIF is scanning. Signed-off-by: Po-Hao Huang <phhuang@realtek.com> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Kalle Valo <kvalo@kernel.org> Link: https://lore.kernel.org/r/20230414121312.17954-1-pkshih@realtek.com
1 parent 982f4a2 commit a1b8015

3 files changed

Lines changed: 8 additions & 5 deletions

File tree

drivers/net/wireless/realtek/rtw88/fw.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2163,8 +2163,10 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
21632163
return ret;
21642164
}
21652165

2166-
void rtw_hw_scan_abort(struct rtw_dev *rtwdev, struct ieee80211_vif *vif)
2166+
void rtw_hw_scan_abort(struct rtw_dev *rtwdev)
21672167
{
2168+
struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif;
2169+
21682170
if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD))
21692171
return;
21702172

drivers/net/wireless/realtek/rtw88/fw.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -868,5 +868,5 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
868868
bool enable);
869869
void rtw_hw_scan_status_report(struct rtw_dev *rtwdev, struct sk_buff *skb);
870870
void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb);
871-
void rtw_hw_scan_abort(struct rtw_dev *rtwdev, struct ieee80211_vif *vif);
871+
void rtw_hw_scan_abort(struct rtw_dev *rtwdev);
872872
#endif

drivers/net/wireless/realtek/rtw88/mac80211.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
393393
* when disconnected by peer
394394
*/
395395
if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
396-
rtw_hw_scan_abort(rtwdev, vif);
396+
rtw_hw_scan_abort(rtwdev);
397+
397398
}
398399

399400
config |= PORT_SET_NET_TYPE;
@@ -870,7 +871,7 @@ static int rtw_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
870871
rtw_hw_scan_start(rtwdev, vif, req);
871872
ret = rtw_hw_scan_offload(rtwdev, vif, true);
872873
if (ret) {
873-
rtw_hw_scan_abort(rtwdev, vif);
874+
rtw_hw_scan_abort(rtwdev);
874875
rtw_err(rtwdev, "HW scan failed with status: %d\n", ret);
875876
}
876877
mutex_unlock(&rtwdev->mutex);
@@ -890,7 +891,7 @@ static void rtw_ops_cancel_hw_scan(struct ieee80211_hw *hw,
890891
return;
891892

892893
mutex_lock(&rtwdev->mutex);
893-
rtw_hw_scan_abort(rtwdev, vif);
894+
rtw_hw_scan_abort(rtwdev);
894895
mutex_unlock(&rtwdev->mutex);
895896
}
896897

0 commit comments

Comments
 (0)