]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
char: misc: Disallow registering miscdevice whose minor > MISC_DYNAMIC_MINOR
authorZijun Hu <zijun.hu@oss.qualcomm.com>
Mon, 14 Jul 2025 15:34:14 +0000 (23:34 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 19 Aug 2025 10:41:17 +0000 (12:41 +0200)
Currently, It is allowed to register miscdevice with minor > 255
which is defined by macro MISC_DYNAMIC_MINOR, and cause:

- Chaos regarding division and management of minor codes.
- Registering failure if the minor was allocated to other dynamic request.

Fortunately, in-kernel users have not had such usage yet.
Fix by refusing to register miscdevice whose minor > 255.

Also bring in a very simple minor code space division and management:

<  255 : Fixed minor code
== 255 : Indicator to request dynamic minor code
>  255 : Dynamic minor code requested, 1048320 minor codes totally
And all fixed minors allocated should be registered in 'linux/miscdevice.h'

Signed-off-by: Zijun Hu <zijun.hu@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250714-rfc_miscdev-v6-3-2ed949665bde@oss.qualcomm.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/char/misc.c
include/linux/miscdevice.h

index 558302a64dd908aee30341547a5413df1af71459..b8e66466184fa21fb66d968db7950e0b5669ac43 100644 (file)
@@ -210,6 +210,12 @@ int misc_register(struct miscdevice *misc)
        int err = 0;
        bool is_dynamic = (misc->minor == MISC_DYNAMIC_MINOR);
 
+       if (misc->minor > MISC_DYNAMIC_MINOR) {
+               pr_err("Invalid fixed minor %d for miscdevice '%s'\n",
+                      misc->minor, misc->name);
+               return -EINVAL;
+       }
+
        INIT_LIST_HEAD(&misc->list);
 
        mutex_lock(&misc_mtx);
index 3e6deb00fc8535a7571f85489c74979e18385bad..565b88efeb23d02b7d91df1cd7df4bdcf2898224 100644 (file)
 #define USERIO_MINOR           240
 #define VHOST_VSOCK_MINOR      241
 #define RFKILL_MINOR           242
+
+/*
+ * Misc char device minor code space division related to below macro:
+ *
+ * <  255  : Fixed minor code
+ * == 255  : Indicator to request dynamic minor code
+ * >  255  : Dynamic minor code requested, 1048320 minor codes totally.
+ */
 #define MISC_DYNAMIC_MINOR     255
 
 struct miscdevice {