]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: brcm80211: fmac: Add error handling for brcmf_usb_dl_writeimage()
authorWentao Liang <vulab@iscas.ac.cn>
Tue, 22 Apr 2025 04:22:02 +0000 (12:22 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 9 May 2025 07:43:52 +0000 (09:43 +0200)
commit 8e089e7b585d95122c8122d732d1d5ef8f879396 upstream.

The function brcmf_usb_dl_writeimage() calls the function
brcmf_usb_dl_cmd() but dose not check its return value. The
'state.state' and the 'state.bytes' are uninitialized if the
function brcmf_usb_dl_cmd() fails. It is dangerous to use
uninitialized variables in the conditions.

Add error handling for brcmf_usb_dl_cmd() to jump to error
handling path if the brcmf_usb_dl_cmd() fails and the
'state.state' and the 'state.bytes' are uninitialized.

Improve the error message to report more detailed error
information.

Fixes: 71bb244ba2fd ("brcm80211: fmac: add USB support for bcm43235/6/8 chipsets")
Cc: stable@vger.kernel.org # v3.4+
Signed-off-by: Wentao Liang <vulab@iscas.ac.cn>
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Link: https://patch.msgid.link/20250422042203.2259-1-vulab@iscas.ac.cn
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c

index 2178675ae1a44d0e04afdd4d26ad6aa0625da8cf..6f64a05debd2cb43928b12572cc37caa40f8671c 100644 (file)
@@ -903,14 +903,16 @@ brcmf_usb_dl_writeimage(struct brcmf_usbdev_info *devinfo, u8 *fw, int fwlen)
        }
 
        /* 1) Prepare USB boot loader for runtime image */
-       brcmf_usb_dl_cmd(devinfo, DL_START, &state, sizeof(state));
+       err = brcmf_usb_dl_cmd(devinfo, DL_START, &state, sizeof(state));
+       if (err)
+               goto fail;
 
        rdlstate = le32_to_cpu(state.state);
        rdlbytes = le32_to_cpu(state.bytes);
 
        /* 2) Check we are in the Waiting state */
        if (rdlstate != DL_WAITING) {
-               brcmf_err("Failed to DL_START\n");
+               brcmf_err("Invalid DL state: %u\n", rdlstate);
                err = -EINVAL;
                goto fail;
        }