Skip to content

Commit e280228

Browse files
Xion Wanggregkh
authored andcommitted
char: Use list_del_init() in misc_deregister() to reinitialize list pointer
Currently, misc_deregister() uses list_del() to remove the device from the list. After list_del(), the list pointers are set to LIST_POISON1 and LIST_POISON2, which may help catch use-after-free bugs, but does not reset the list head. If misc_deregister() is called more than once on the same device, list_empty() will not return true, and list_del() may be called again, leading to undefined behavior. Replace list_del() with list_del_init() to reinitialize the list head after deletion. This makes the code more robust against double deregistration and allows safe usage of list_empty() on the miscdevice after deregistration. [ Note, this seems to keep broken out-of-tree drivers from doing foolish things. While this does not matter for any in-kernel drivers, external drivers could use a bit of help to show them they shouldn't be doing stuff like re-registering misc devices - gregkh ] Signed-off-by: Xion Wang <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent ceda408 commit e280228

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

drivers/char/misc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ EXPORT_SYMBOL(misc_register);
284284
void misc_deregister(struct miscdevice *misc)
285285
{
286286
mutex_lock(&misc_mtx);
287-
list_del(&misc->list);
287+
list_del_init(&misc->list);
288288
device_destroy(&misc_class, MKDEV(MISC_MAJOR, misc->minor));
289289
misc_minor_free(misc->minor);
290290
if (misc->minor > MISC_DYNAMIC_MINOR)

0 commit comments

Comments
 (0)