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: Oliver Neukum <oneukum@suse.com> Signed-off-by: Keith Packard <keithp@keithp.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5b93fe3143
commit
0a15e24c27
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue