Commit 3f804cd1 authored by Thadeu Lima de Souza Cascardo's avatar Thadeu Lima de Souza Cascardo Committed by james toy

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: default avatarThadeu 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 5962e51e
...@@ -217,6 +217,9 @@ int misc_register(struct miscdevice * misc) ...@@ -217,6 +217,9 @@ int misc_register(struct miscdevice * misc)
misc->this_device = device_create(misc_class, misc->parent, dev, misc->this_device = device_create(misc_class, misc->parent, dev,
misc, "%s", misc->name); misc, "%s", misc->name);
if (IS_ERR(misc->this_device)) { 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); err = PTR_ERR(misc->this_device);
goto out; goto out;
} }
...@@ -251,9 +254,8 @@ int misc_deregister(struct miscdevice *misc) ...@@ -251,9 +254,8 @@ int misc_deregister(struct miscdevice *misc)
mutex_lock(&misc_mtx); mutex_lock(&misc_mtx);
list_del(&misc->list); list_del(&misc->list);
device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor)); device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
if (i < DYNAMIC_MINORS && i>0) { if (i < DYNAMIC_MINORS && i >= 0)
misc_minors[i>>3] &= ~(1 << (misc->minor & 7)); misc_minors[i>>3] &= ~(1 << (i & 7));
}
mutex_unlock(&misc_mtx); mutex_unlock(&misc_mtx);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment