]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw88: always wait for both firmware loading attempts
authorDmitry Antipov <dmantipov@yandex.ru>
Fri, 26 Jul 2024 11:46:57 +0000 (14:46 +0300)
committerPing-Ke Shih <pkshih@realtek.com>
Fri, 2 Aug 2024 01:31:12 +0000 (09:31 +0800)
In 'rtw_wait_firmware_completion()', always wait for both (regular and
wowlan) firmware loading attempts. Otherwise if 'rtw_usb_intf_init()'
has failed in 'rtw_usb_probe()', 'rtw_usb_disconnect()' may issue
'ieee80211_free_hw()' when one of 'rtw_load_firmware_cb()' (usually
the wowlan one) is still in progress, causing UAF detected by KASAN.

Fixes: c8e5695eae99 ("rtw88: load wowlan firmware if wowlan is supported")
Reported-by: syzbot+6c6c08700f9480c41fe3@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=6c6c08700f9480c41fe3
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20240726114657.25396-1-dmantipov@yandex.ru
drivers/net/wireless/realtek/rtw88/main.c

index dd77adea15c7ba268bfbb7187fe32dbb5fdf5959..9c58b7a41b9592f2aa5f8ce1b1ef8db2f834ba31 100644 (file)
@@ -1313,20 +1313,21 @@ static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
 {
        const struct rtw_chip_info *chip = rtwdev->chip;
        struct rtw_fw_state *fw;
+       int ret = 0;
 
        fw = &rtwdev->fw;
        wait_for_completion(&fw->completion);
        if (!fw->firmware)
-               return -EINVAL;
+               ret = -EINVAL;
 
        if (chip->wow_fw_name) {
                fw = &rtwdev->wow_fw;
                wait_for_completion(&fw->completion);
                if (!fw->firmware)
-                       return -EINVAL;
+                       ret = -EINVAL;
        }
 
-       return 0;
+       return ret;
 }
 
 static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev *rtwdev,