USB: mxu11x0: fix memory leak on firmware download
authorJohan Hovold <johan@kernel.org>
Tue, 29 Dec 2015 12:36:12 +0000 (13:36 +0100)
committerJohan Hovold <johan@kernel.org>
Tue, 29 Dec 2015 12:43:14 +0000 (13:43 +0100)
Make sure to release the private data before returning -ENODEV after
having downloaded the firmware during first probe.

Clean up the error paths while at it.

Signed-off-by: Johan Hovold <johan@kernel.org>
drivers/usb/serial/mxu11x0.c

index 89426c3eba989f58410b546219390dbd2ae03732..c6c4776997fcdeac7f7496b997a6c73c19739407 100644 (file)
@@ -377,7 +377,6 @@ static int mxu1_startup(struct usb_serial *serial)
        char fw_name[32];
        const struct firmware *fw_p = NULL;
        int err;
-       int status = 0;
 
        dev_dbg(&serial->interface->dev, "%s - product 0x%04X, num configurations %d, configuration value %d\n",
                __func__, le16_to_cpu(dev->descriptor.idProduct),
@@ -407,22 +406,26 @@ static int mxu1_startup(struct usb_serial *serial)
                if (err) {
                        dev_err(&serial->interface->dev, "failed to request firmware: %d\n",
                                err);
-                       kfree(mxdev);
-                       return err;
+                       goto err_free_mxdev;
                }
 
                err = mxu1_download_firmware(serial, fw_p);
-               if (err) {
-                       release_firmware(fw_p);
-                       kfree(mxdev);
-                       return err;
-               }
+               if (err)
+                       goto err_release_firmware;
 
-               status = -ENODEV;
-               release_firmware(fw_p);
+               /* device is being reset */
+               err = -ENODEV;
+               goto err_release_firmware;
        }
 
-       return status;
+       return 0;
+
+err_release_firmware:
+       release_firmware(fw_p);
+err_free_mxdev:
+       kfree(mxdev);
+
+       return err;
 }
 
 static int mxu1_write_byte(struct usb_serial_port *port, u32 addr,