summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2009-09-25 06:32:58 (GMT)
committerRusty Russell <rusty@rustcorp.com.au>2009-09-24 15:02:59 (GMT)
commita263f7763c364015f92e7c097fa46c6673f6fcb0 (patch)
tree3fecc1a81f60ef71bc59c751f298496f9b0b1da6 /kernel
parent1d7015caa082d465faeae5d6fd1be077ee6dfa87 (diff)
downloadlinux-fsl-qoriq-a263f7763c364015f92e7c097fa46c6673f6fcb0.tar.xz
module: fix memory leak when load fails after srcversion/version allocated
Normally the twisty paths of sysfs will free the attributes, but not if we fail before we hook it into sysfs (which is the last thing we do in load_module). (This sysfs code is a turd, no doubt there are other issues lurking too). Reported-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Cc: Catalin Marinas <catalin.marinas@arm.com> Tested-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/module.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/kernel/module.c b/kernel/module.c
index 39827c3..c54f10d 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1797,6 +1797,17 @@ static void setup_modinfo(struct module *mod, Elf_Shdr *sechdrs,
}
}
+static void free_modinfo(struct module *mod)
+{
+ struct module_attribute *attr;
+ int i;
+
+ for (i = 0; (attr = modinfo_attrs[i]); i++) {
+ if (attr->free)
+ attr->free(mod);
+ }
+}
+
#ifdef CONFIG_KALLSYMS
/* lookup symbol in given range of kernel_symbols */
@@ -2506,6 +2517,7 @@ static noinline struct module *load_module(void __user *umod,
synchronize_sched();
module_arch_cleanup(mod);
cleanup:
+ free_modinfo(mod);
kobject_del(&mod->mkobj.kobj);
kobject_put(&mod->mkobj.kobj);
free_unload: