diff options
| author | Dmitry Antipov <dmantipov@yandex.ru> | 2025-05-07 09:50:44 +0300 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2025-06-04 14:36:55 +0200 |
| commit | a63d99873547d8b39eb2f6db79dd235761e7098a (patch) | |
| tree | 85d5469803566513ba3bb42a2bd3016a64c2e69e /kernel | |
| parent | f1bcac367bc95631afbb918348f30dec887d0e1b (diff) | |
| download | linux-a63d99873547d8b39eb2f6db79dd235761e7098a.tar.gz linux-a63d99873547d8b39eb2f6db79dd235761e7098a.tar.bz2 linux-a63d99873547d8b39eb2f6db79dd235761e7098a.zip | |
module: ensure that kobject_put() is safe for module type kobjects
commit a6aeb739974ec73e5217c75a7c008a688d3d5cf1 upstream.
In 'lookup_or_create_module_kobject()', an internal kobject is created
using 'module_ktype'. So call to 'kobject_put()' on error handling
path causes an attempt to use an uninitialized completion pointer in
'module_kobject_release()'. In this scenario, we just want to release
kobject without an extra synchronization required for a regular module
unloading process, so adding an extra check whether 'complete()' is
actually required makes 'kobject_put()' safe.
Reported-by: syzbot+7fb8a372e1f6add936dd@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=7fb8a372e1f6add936dd
Fixes: 942e443127e9 ("module: Fix mod->mkobj.kobj potentially freed too early")
Cc: stable@vger.kernel.org
Suggested-by: Petr Pavlu <petr.pavlu@suse.com>
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
Link: https://lore.kernel.org/r/20250507065044.86529-1-dmantipov@yandex.ru
Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/params.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/kernel/params.c b/kernel/params.c index eb00abef7076..0df4a315760d 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -947,7 +947,9 @@ int module_sysfs_initialized; static void module_kobj_release(struct kobject *kobj) { struct module_kobject *mk = to_module_kobject(kobj); - complete(mk->kobj_completion); + + if (mk->kobj_completion) + complete(mk->kobj_completion); } struct kobj_type module_ktype = { |
