]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
usb/misc/chaoskey: Cleanup probe failure paths
authorOliver Neukum <oneukum@suse.com>
Wed, 17 Feb 2016 17:58:11 +0000 (09:58 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 21 Feb 2016 04:12:21 +0000 (20:12 -0800)
Shares the cleanup code between all probe failure paths, instead of
having per-failure cleanup at each point in the function.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/misc/chaoskey.c

index 23c794813e6a923bff5b0a3719abbea860ee416d..cb1c239cad72f682f32f2fd674bb8f05bcc348df 100644 (file)
@@ -93,10 +93,12 @@ struct chaoskey {
 
 static void chaoskey_free(struct chaoskey *dev)
 {
-       usb_dbg(dev->interface, "free");
-       kfree(dev->name);
-       kfree(dev->buf);
-       kfree(dev);
+       if (dev) {
+               usb_dbg(dev->interface, "free");
+               kfree(dev->name);
+               kfree(dev->buf);
+               kfree(dev);
+       }
 }
 
 static int chaoskey_probe(struct usb_interface *interface,
@@ -107,7 +109,7 @@ static int chaoskey_probe(struct usb_interface *interface,
        int i;
        int in_ep = -1;
        struct chaoskey *dev;
-       int result;
+       int result = -ENOMEM;
        int size;
 
        usb_dbg(interface, "probe %s-%s", udev->product, udev->serial);
@@ -142,14 +144,12 @@ static int chaoskey_probe(struct usb_interface *interface,
        dev = kzalloc(sizeof(struct chaoskey), GFP_KERNEL);
 
        if (dev == NULL)
-               return -ENOMEM;
+               goto out;
 
        dev->buf = kmalloc(size, GFP_KERNEL);
 
-       if (dev->buf == NULL) {
-               kfree(dev);
-               return -ENOMEM;
-       }
+       if (dev->buf == NULL)
+               goto out;
 
        /* Construct a name using the product and serial values. Each
         * device needs a unique name for the hwrng code
@@ -158,11 +158,8 @@ static int chaoskey_probe(struct usb_interface *interface,
        if (udev->product && udev->serial) {
                dev->name = kmalloc(strlen(udev->product) + 1 +
                                    strlen(udev->serial) + 1, GFP_KERNEL);
-               if (dev->name == NULL) {
-                       kfree(dev->buf);
-                       kfree(dev);
-                       return -ENOMEM;
-               }
+               if (dev->name == NULL)
+                       goto out;
 
                strcpy(dev->name, udev->product);
                strcat(dev->name, "-");
@@ -186,9 +183,7 @@ static int chaoskey_probe(struct usb_interface *interface,
        result = usb_register_dev(interface, &chaoskey_class);
        if (result) {
                usb_err(interface, "Unable to allocate minor number.");
-               usb_set_intfdata(interface, NULL);
-               chaoskey_free(dev);
-               return result;
+               goto out;
        }
 
        dev->hwrng.name = dev->name ? dev->name : chaoskey_driver.name;
@@ -215,6 +210,11 @@ static int chaoskey_probe(struct usb_interface *interface,
 
        usb_dbg(interface, "chaoskey probe success, size %d", dev->size);
        return 0;
+
+out:
+       usb_set_intfdata(interface, NULL);
+       chaoskey_free(dev);
+       return result;
 }
 
 static void chaoskey_disconnect(struct usb_interface *interface)