Commit 0a15e24c authored by Oliver Neukum's avatar Oliver Neukum Committed by Greg Kroah-Hartman

usb/misc/chaoskey: Cleanup probe failure paths

Shares the cleanup code between all probe failure paths, instead of
having per-failure cleanup at each point in the function.
Signed-off-by: default avatarOliver Neukum <oneukum@suse.com>
Signed-off-by: default avatarKeith Packard <keithp@keithp.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5b93fe31
...@@ -93,10 +93,12 @@ struct chaoskey { ...@@ -93,10 +93,12 @@ struct chaoskey {
static void chaoskey_free(struct chaoskey *dev) static void chaoskey_free(struct chaoskey *dev)
{ {
usb_dbg(dev->interface, "free"); if (dev) {
kfree(dev->name); usb_dbg(dev->interface, "free");
kfree(dev->buf); kfree(dev->name);
kfree(dev); kfree(dev->buf);
kfree(dev);
}
} }
static int chaoskey_probe(struct usb_interface *interface, static int chaoskey_probe(struct usb_interface *interface,
...@@ -107,7 +109,7 @@ static int chaoskey_probe(struct usb_interface *interface, ...@@ -107,7 +109,7 @@ static int chaoskey_probe(struct usb_interface *interface,
int i; int i;
int in_ep = -1; int in_ep = -1;
struct chaoskey *dev; struct chaoskey *dev;
int result; int result = -ENOMEM;
int size; int size;
usb_dbg(interface, "probe %s-%s", udev->product, udev->serial); usb_dbg(interface, "probe %s-%s", udev->product, udev->serial);
...@@ -142,14 +144,12 @@ static int chaoskey_probe(struct usb_interface *interface, ...@@ -142,14 +144,12 @@ static int chaoskey_probe(struct usb_interface *interface,
dev = kzalloc(sizeof(struct chaoskey), GFP_KERNEL); dev = kzalloc(sizeof(struct chaoskey), GFP_KERNEL);
if (dev == NULL) if (dev == NULL)
return -ENOMEM; goto out;
dev->buf = kmalloc(size, GFP_KERNEL); dev->buf = kmalloc(size, GFP_KERNEL);
if (dev->buf == NULL) { if (dev->buf == NULL)
kfree(dev); goto out;
return -ENOMEM;
}
/* Construct a name using the product and serial values. Each /* Construct a name using the product and serial values. Each
* device needs a unique name for the hwrng code * device needs a unique name for the hwrng code
...@@ -158,11 +158,8 @@ static int chaoskey_probe(struct usb_interface *interface, ...@@ -158,11 +158,8 @@ static int chaoskey_probe(struct usb_interface *interface,
if (udev->product && udev->serial) { if (udev->product && udev->serial) {
dev->name = kmalloc(strlen(udev->product) + 1 + dev->name = kmalloc(strlen(udev->product) + 1 +
strlen(udev->serial) + 1, GFP_KERNEL); strlen(udev->serial) + 1, GFP_KERNEL);
if (dev->name == NULL) { if (dev->name == NULL)
kfree(dev->buf); goto out;
kfree(dev);
return -ENOMEM;
}
strcpy(dev->name, udev->product); strcpy(dev->name, udev->product);
strcat(dev->name, "-"); strcat(dev->name, "-");
...@@ -186,9 +183,7 @@ static int chaoskey_probe(struct usb_interface *interface, ...@@ -186,9 +183,7 @@ static int chaoskey_probe(struct usb_interface *interface,
result = usb_register_dev(interface, &chaoskey_class); result = usb_register_dev(interface, &chaoskey_class);
if (result) { if (result) {
usb_err(interface, "Unable to allocate minor number."); usb_err(interface, "Unable to allocate minor number.");
usb_set_intfdata(interface, NULL); goto out;
chaoskey_free(dev);
return result;
} }
dev->hwrng.name = dev->name ? dev->name : chaoskey_driver.name; dev->hwrng.name = dev->name ? dev->name : chaoskey_driver.name;
...@@ -215,6 +210,11 @@ static int chaoskey_probe(struct usb_interface *interface, ...@@ -215,6 +210,11 @@ static int chaoskey_probe(struct usb_interface *interface,
usb_dbg(interface, "chaoskey probe success, size %d", dev->size); usb_dbg(interface, "chaoskey probe success, size %d", dev->size);
return 0; return 0;
out:
usb_set_intfdata(interface, NULL);
chaoskey_free(dev);
return result;
} }
static void chaoskey_disconnect(struct usb_interface *interface) static void chaoskey_disconnect(struct usb_interface *interface)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment