Skip to content

Commit

Permalink
drivers/char/misc.c: clear allocation bit in minor bitmap when device…
Browse files Browse the repository at this point in the history
… register fails

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>
  • Loading branch information
Thadeu Lima de Souza Cascardo authored and torvalds committed Dec 15, 2009
1 parent 603c4ba commit 4ae717d
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions drivers/char/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 4ae717d

Please sign in to comment.