diff options
author | Dmitry Torokhov <dtor@mail.ru> | 2007-04-04 12:40:57 +0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2007-04-11 12:36:03 +0400 |
commit | 5d6341c606b9eb62fbaa7b2a0da82ac851bf0fc4 (patch) | |
tree | 5ab2882f7b524ba20dab60957ab2d8176fc9890c /drivers/hid/usbhid/usbmouse.c | |
parent | 66df514b1dbf51a0a02a8abe1219e46e49710aea (diff) | |
download | linux-5d6341c606b9eb62fbaa7b2a0da82ac851bf0fc4.tar.xz |
USB HID: usbkbd/usbmouse - handle errors when registering devices
Handle errors when registering input devices in usbkbd/usbmouse.
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/usbhid/usbmouse.c')
-rw-r--r-- | drivers/hid/usbhid/usbmouse.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/hid/usbhid/usbmouse.c b/drivers/hid/usbhid/usbmouse.c index 692fd6087779..573776d865e1 100644 --- a/drivers/hid/usbhid/usbmouse.c +++ b/drivers/hid/usbhid/usbmouse.c @@ -120,6 +120,7 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i struct usb_mouse *mouse; struct input_dev *input_dev; int pipe, maxp; + int error = -ENOMEM; interface = intf->cur_altsetting; @@ -188,15 +189,21 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i mouse->irq->transfer_dma = mouse->data_dma; mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - input_register_device(mouse->dev); + error = input_register_device(mouse->dev); + if (error) + goto fail3; usb_set_intfdata(intf, mouse); return 0; -fail2: usb_buffer_free(dev, 8, mouse->data, mouse->data_dma); -fail1: input_free_device(input_dev); +fail3: + usb_free_urb(mouse->irq); +fail2: + usb_buffer_free(dev, 8, mouse->data, mouse->data_dma); +fail1: + input_free_device(input_dev); kfree(mouse); - return -ENOMEM; + return error; } static void usb_mouse_disconnect(struct usb_interface *intf) |