drivers/char/misc.c: clear allocation bit in minor bitmap when device register fails
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Tue, 15 Dec 2009 02:00:30 +0000 (18:00 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 15 Dec 2009 16:53:27 +0000 (08:53 -0800)
If there's a failure creating the device (because there's already one with
the same name, for example), the current implementation does not clear the
bit for the allocated minor and that number is lost for future
allocations.

Second, the test currently in misc_deregister is broken, since it does not
test for the 0 minor.

Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/char/misc.c

index 281edefffa0b2b30f02e7f68caca67c59921ed79..a3a02f6303c89238d5cc524e3c2dbb54f977eaf8 100644 (file)
@@ -214,6 +214,9 @@ int misc_register(struct miscdevice * misc)
        misc->this_device = device_create(misc_class, misc->parent, dev,
                                          misc, "%s", misc->name);
        if (IS_ERR(misc->this_device)) {
+               int i = misc->minor;
+               if (i < DYNAMIC_MINORS && i >= 0)
+                       misc_minors[i>>3] &= ~(1 << (i & 7));
                err = PTR_ERR(misc->this_device);
                goto out;
        }
@@ -248,9 +251,8 @@ int misc_deregister(struct miscdevice *misc)
        mutex_lock(&misc_mtx);
        list_del(&misc->list);
        device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
-       if (i < DYNAMIC_MINORS && i>0) {
-               misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
-       }
+       if (i < DYNAMIC_MINORS && i >= 0)
+               misc_minors[i>>3] &= ~(1 << (i & 7));
        mutex_unlock(&misc_mtx);
        return 0;
 }