* + params-serialize-lookup_or_create_module_kobject.patch added to mm-nonmm-unstable branch
@ 2026-10-31 2:53 Andrew Morton
0 siblings, 0 replies; only message in thread
From: Andrew Morton @ 2026-10-31 2:53 UTC (permalink / raw)
To: mm-commits, stable, shyamsaini, samitolvanen, petr.pavlu, kees,
gregkh, xujiakai24, akpm
The patch titled
Subject: params: serialize lookup_or_create_module_kobject()
has been added to the -mm mm-nonmm-unstable branch. Its filename is
params-serialize-lookup_or_create_module_kobject.patch
This patch will shortly appear at
https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/params-serialize-lookup_or_create_module_kobject.patch
This patch will later appear in the mm-nonmm-unstable branch at
git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Before you just go and hit "reply", please:
a) Consider who else should be cc'ed
b) Prefer to cc a suitable mailing list as well
c) Ideally: find the original patch on the mailing list and do a
reply-to-all to that, adding suitable additional cc's
*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***
The -mm tree is included into linux-next via various
branches at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there most days
------------------------------------------------------
From: Jiakai Xu <xujiakai24@mails.ucas.ac.cn>
Subject: params: serialize lookup_or_create_module_kobject()
Date: Fri, 18 Sep 2026 10:07:12 +0000
lookup_or_create_module_kobject() first looks up the module kobject with
kset_find_obj() and, if not found, creates a new one with
kobject_init_and_add(). The function is called at runtime from
module_add_driver() since commit f95bbfe18512 ("drivers: base: handle
module_kobject creation"), which means two concurrent driver
registrations for the same built-in module name can both miss the
lookup and race to create the same kobject.
The loser of the race gets -EEXIST from kobject_init_and_add() and its
kobject is removed from module_kset by kobject_add_internal() before
the failure is reported. The error path then calls kobject_put(),
which invokes module_kobj_release(), but that only completes
->kobj_completion and never frees the dynamically allocated
module_kobject, leaking it (96 bytes) along with the object having been
detached from the kset.
This is triggerable by unprivileged users, e.g. by concurrently issuing
the USB_RAW_IOCTL_RUN ioctl of the raw-gadget driver, which registers the
"raw_gadget" driver on the gadget bus:
sysfs: cannot create duplicate filename '/module/raw_gadget'
...
Adding module 'raw_gadget' to sysfs failed (-17), the system may be
unstable.
...
unreferenced object 0xffff8880188dacc0 (size 96):
backtrace:
lookup_or_create_module_kobject+0x47/0x100
module_add_driver+0x73/0x1b0
bus_add_driver+0x1d9/0x340
driver_register+0xde/0x170
Fix it by serializing the lookup and the creation with a mutex, so that
the second caller finds the kobject created by the first one instead of
racing with it.
The patch fixes the module_kobject leak in this specific race condition,
but not in cases when kobject_init_and_add() (or sysfs_create_file())
fails for another reason.
Link: https://lore.kernel.org/20260918100712.3124994-1-xujiakai24@mails.ucas.ac.cn
Fixes: f95bbfe18512 ("drivers: base: handle module_kobject creation")
Fixes: 7c76c813cfc4 ("kernel: globalize lookup_or_create_module_kobject()")
Signed-off-by: Jiakai Xu <xujiakai24@mails.ucas.ac.cn>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Petr Pavlu <petr.pavlu@suse.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Shyam Saini <shyamsaini@linux.microsoft.com>
Cc: Sami Tolvanen <samitolvanen@google.com>
Cc: Kees Cook <kees@kernel.org>
Cc: <stable@vger.kernel.org>
---
kernel/params.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
--- a/kernel/params.c~params-serialize-lookup_or_create_module_kobject
+++ a/kernel/params.c
@@ -3,6 +3,7 @@
* Helpers for initial module or kernel cmdline parsing
* Copyright (C) 2001 Rusty Russell.
*/
+#include <linux/cleanup.h>
#include <linux/ctype.h>
#include <linux/device.h>
#include <linux/err.h>
@@ -20,6 +21,12 @@
/* Protects all built-in parameters, modules use their own param_lock */
static DEFINE_MUTEX(param_lock);
+/*
+ * Serializes module kobject lookup and creation in
+ * lookup_or_create_module_kobject()
+ */
+static DEFINE_MUTEX(mod_kobject_mutex);
+
/* Use the module's mutex, or if built-in use the built-in mutex */
#ifdef CONFIG_MODULES
#define KPARAM_MUTEX(mod) ((mod) ? &(mod)->param_lock : ¶m_lock)
@@ -754,6 +761,13 @@ lookup_or_create_module_kobject(const ch
struct kobject *kobj;
int err;
+ /*
+ * The lookup and the creation must be done atomically, otherwise
+ * concurrent callers may race to create the same kobject, and the
+ * loser of the race gets -EEXIST from kobject_init_and_add().
+ */
+ guard(mutex)(&mod_kobject_mutex);
+
kobj = kset_find_obj(module_kset, name);
if (kobj)
return to_module_kobject(kobj);
_
Patches currently in -mm which might be from xujiakai24@mails.ucas.ac.cn are
params-serialize-lookup_or_create_module_kobject.patch
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-10-31 2:53 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-31 2:53 + params-serialize-lookup_or_create_module_kobject.patch added to mm-nonmm-unstable branch Andrew Morton
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.