]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
char: misc: Does not request module for miscdevice with dynamic minor
authorZijun Hu <zijun.hu@oss.qualcomm.com>
Mon, 14 Jul 2025 15:34:17 +0000 (23:34 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:37:04 +0000 (15:37 -0500)
[ Upstream commit 1ba0fb42aa6a5f072b1b8c0b0520b32ad4ef4b45 ]

misc_open() may request module for miscdevice with dynamic minor, which
is meaningless since:

- The dynamic minor allocated is unknown in advance without registering
  miscdevice firstly.
- Macro MODULE_ALIAS_MISCDEV() is not applicable for dynamic minor.

Fix by only requesting module for miscdevice with fixed minor.

Acked-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
Signed-off-by: Zijun Hu <zijun.hu@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250714-rfc_miscdev-v6-6-2ed949665bde@oss.qualcomm.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/char/misc.c

index 255a164eec86d18856ed0f7ca15edd4a93f73914..4c276b8066ff8d244ad56fb73f5fe806d6ca0c59 100644 (file)
@@ -132,7 +132,8 @@ static int misc_open(struct inode *inode, struct file *file)
                break;
        }
 
-       if (!new_fops) {
+       /* Only request module for fixed minor code */
+       if (!new_fops && minor < MISC_DYNAMIC_MINOR) {
                mutex_unlock(&misc_mtx);
                request_module("char-major-%d-%d", MISC_MAJOR, minor);
                mutex_lock(&misc_mtx);
@@ -144,10 +145,11 @@ static int misc_open(struct inode *inode, struct file *file)
                        new_fops = fops_get(iter->fops);
                        break;
                }
-               if (!new_fops)
-                       goto fail;
        }
 
+       if (!new_fops)
+               goto fail;
+
        /*
         * Place the miscdevice in the file's
         * private_data so it can be used by the