staging: wlan-ng: fix leaks on failure paths in prism2sta_probe_usb()
authorAlexey Khoroshilov <khoroshilov@ispras.ru>
Fri, 10 Jan 2014 21:22:11 +0000 (01:22 +0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 11 Jan 2014 20:52:42 +0000 (12:52 -0800)
There are leaks of resources allocated by wlan_setup() and usb_dev refcnt
on failure paths in prism2sta_probe_usb().

The patch adds appropriate deallocations and removes invalid code
from hfa384x_corereset() failure handling.
unregister_wlandev() is wrong because it is not registered yet.
hfa384x_destroy() is just noop in init state.

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wlan-ng/prism2usb.c

index b401974..4739c14 100644 (file)
@@ -140,11 +140,9 @@ static int prism2sta_probe_usb(struct usb_interface *interface,
                                           prism2_reset_holdtime,
                                           prism2_reset_settletime, 0);
                if (result != 0) {
-                       unregister_wlandev(wlandev);
-                       hfa384x_destroy(hw);
                        result = -EIO;
                        dev_err(&interface->dev, "hfa384x_corereset() failed.\n");
-                       goto failed;
+                       goto failed_reset;
                }
        }
 
@@ -159,11 +157,15 @@ static int prism2sta_probe_usb(struct usb_interface *interface,
        if (register_wlandev(wlandev) != 0) {
                dev_err(&interface->dev, "register_wlandev() failed.\n");
                result = -EIO;
-               goto failed;
+               goto failed_register;
        }
 
        goto done;
 
+failed_register:
+       usb_put_dev(dev);
+failed_reset:
+       wlan_unsetup(wlandev);
 failed:
        kfree(wlandev);
        kfree(hw);