Message ID | 1511642376-16279-1-git-send-email-arend.vanspriel@broadcom.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 5c3de777bdaf48bd0cfb43097c0d0fb85056cab7 |
Delegated to: | Kalle Valo |
Headers | show |
Arend van Spriel <arend.vanspriel@broadcom.com> writes: > In the function brcmf_sdio_firmware_callback() the driver is > unbound from the sdio function devices in the error path. > However, the order in which it is done resulted in a use-after-free > issue (see brcmf_ops_sdio_remove() in bcmsdh.c). Hence change > the order and first unbind sdio function #2 device and then > unbind sdio function #1 device. > > Cc: stable@vger.kernel.org # v4.12.x > Fixes: 7a51461fc2da ("brcmfmac: unbind all devices upon failure in firmware callback") > Reported-by: Stefan Wahren <stefan.wahren@i2se.com> > Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> > Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> > Reviewed-by: Franky Lin <franky.lin@broadcom.com> > Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> I'll queue this for v4.15.
Arend Van Spriel <arend.vanspriel@broadcom.com> wrote: > In the function brcmf_sdio_firmware_callback() the driver is > unbound from the sdio function devices in the error path. > However, the order in which it is done resulted in a use-after-free > issue (see brcmf_ops_sdio_remove() in bcmsdh.c). Hence change > the order and first unbind sdio function #2 device and then > unbind sdio function #1 device. > > Cc: stable@vger.kernel.org # v4.12.x > Fixes: 7a51461fc2da ("brcmfmac: unbind all devices upon failure in firmware callback") > Reported-by: Stefan Wahren <stefan.wahren@i2se.com> > Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> > Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> > Reviewed-by: Franky Lin <franky.lin@broadcom.com> > Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> Patch applied to wireless-drivers.git, thanks. 5c3de777bdaf brcmfmac: change driver unbind order of the sdio function devices
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c index e3495ea..3108f7ee 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c @@ -4121,8 +4121,8 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, sdio_release_host(sdiodev->func[1]); fail: brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), err); - device_release_driver(dev); device_release_driver(&sdiodev->func[2]->dev); + device_release_driver(dev); } struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)