Modules race fix
PATCH 1/1 Modules race fix
Linus, please apply.
Name: Fix two module races
Author: Bob Miller, Rusty Russell
Status: Trivial
D: Bob Miller points out that the try_module_get in use_module() can,
D: of course, fail. Secondly, there is a race between setting the module
D: live, and a simultaneous removal of it.
kernel/module.c +6 -1
@@ -173,16 +173,19 @@ static int use_module(struct module *a,struct module_use *use;if (b ==NULL ||already_uses (a, b))return 1 ; +if (!strong_try_module_get (b)) +return 0 ; +DEBUGP ("Allocating new usage for %s.\n" , a->name); use =kmalloc (sizeof (*use),GFP_ATOMIC );if (!use) {printk ("%s: out of memory loading\n" , a->name); +module_put (b);return 0 ; } use->module_which_uses = a;list_add (&use->list, &b->modules_which_use_me); -try_module_get (b);/* Can't fail */ return 1 ; }
@@ -1456,10 +1459,12 @@ sys_init_module(void *umod, }/* Now it's a first class citizen! */ +down (&module_mutex); mod->state =MODULE_STATE_LIVE ;module_free (mod, mod->module_init); mod->module_init =NULL ; mod->init_size =0 ; +up (&module_mutex);return 0 ; }
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.