summaryrefslogtreecommitdiffstats
path: root/kernel/module.c
diff options
context:
space:
mode:
authorMasami Hiramatsu2014-11-09 23:56:29 +0100
committerRusty Russell2014-11-11 07:37:44 +0100
commit4f48795b6154852d07d971e402c35ecc460ddcb6 (patch)
tree65ae9d457d88034c8105d1a94082653b90ca88d2 /kernel/module.c
parentLinux 3.18-rc3 (diff)
downloadkernel-qcow2-linux-4f48795b6154852d07d971e402c35ecc460ddcb6.tar.gz
kernel-qcow2-linux-4f48795b6154852d07d971e402c35ecc460ddcb6.tar.xz
kernel-qcow2-linux-4f48795b6154852d07d971e402c35ecc460ddcb6.zip
module: Wait for RCU synchronizing before releasing a module
Wait for RCU synchronizing on failure path of module loading before releasing struct module, because the memory of mod->list can still be accessed by list walkers (e.g. kallsyms). Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'kernel/module.c')
-rw-r--r--kernel/module.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/kernel/module.c b/kernel/module.c
index 88cec1ddb1e3..331b03f6b411 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -3326,6 +3326,8 @@ static int load_module(struct load_info *info, const char __user *uargs,
/* Unlink carefully: kallsyms could be walking list. */
list_del_rcu(&mod->list);
wake_up_all(&module_wq);
+ /* Wait for RCU synchronizing before releasing mod->list. */
+ synchronize_rcu();
mutex_unlock(&module_mutex);
free_module:
module_deallocate(mod, info);