Hi,

several resources are not freed if autoresume fails.

        Regards
                Oliver

Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]>

----

--- a/drivers/hid/usbhid/hiddev.c       2007-10-05 15:42:45.000000000 +0200
+++ b/drivers/hid/usbhid/hiddev.c       2007-10-05 15:54:32.000000000 +0200
@@ -280,18 +280,21 @@ static int hiddev_open(struct inode *ino
 
        list->hiddev = hiddev_table[i];
 
-       spin_lock_irqsave(&list->hiddev->list_lock, flags);
-       list_add_tail(&list->node, &hiddev_table[i]->list);
-       spin_unlock_irqrestore(&list->hiddev->list_lock, flags);
-
-       file->private_data = list;
-
        if (!list->hiddev->open++)
                if (list->hiddev->exist) {
                        struct hid_device *hid = hiddev_table[i]->hid;
                        res = usbhid_get_power(hid);
-                       if (res < 0)
+                       if (res < 0) {
+                               hiddev_table[i]->open--;
+                               kfree(list);
                                return -EIO;
+                       } else {
+                               spin_lock_irqsave(&list->hiddev->list_lock, 
flags);
+                               list_add_tail(&list->node, 
&hiddev_table[i]->list);
+                               
spin_unlock_irqrestore(&list->hiddev->list_lock, flags);
+
+                               file->private_data = list;      
+                       }
                        usbhid_open(hid);
                }
 

Reply via email to