diff options
author | Akiyama, Nobuyuki <akiyama.nobuyuk@jp.fujitsu.com> | 2008-07-17 14:22:01 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2008-07-17 14:22:01 -0400 |
commit | 740a8de0796dd12890b3c8ddcfabfcb528b78d40 (patch) | |
tree | b9ae53a096b7ea3216c04009c9c085015115b96b /arch | |
parent | 60192db82952ad56ef7bbc4a318e2041ca65ba7d (diff) |
[IA64] adding parameter check to module_free()
module_free() refers the first parameter before checking.
But it is called like below(in kernel/kprobes). The first parameter is always NULL.
This happens when many probe points(>1024) are set by kprobes.
I encountered this with using SystemTap. It can set many probes easily.
static int __kprobes collect_one_slot(struct kprobe_insn_page *kip, int idx)
{
...
if (kip->nused == 0) {
hlist_del(&kip->hlist);
if (hlist_empty(&kprobe_insn_pages)) {
...
} else {
module_free(NULL, kip->insns); //<<< 1st param always NULL
kfree(kip);
}
return 1;
}
return 0;
}
Signed-off-by: Akiyama, Nobuyuki <akiyama.nobuyuk@jp.fujitsu.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/ia64/kernel/module.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index e83e2ea3b3e0..29aad349e0c4 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c | |||
@@ -321,7 +321,8 @@ module_alloc (unsigned long size) | |||
321 | void | 321 | void |
322 | module_free (struct module *mod, void *module_region) | 322 | module_free (struct module *mod, void *module_region) |
323 | { | 323 | { |
324 | if (mod->arch.init_unw_table && module_region == mod->module_init) { | 324 | if (mod && mod->arch.init_unw_table && |
325 | module_region == mod->module_init) { | ||
325 | unw_remove_unwind_table(mod->arch.init_unw_table); | 326 | unw_remove_unwind_table(mod->arch.init_unw_table); |
326 | mod->arch.init_unw_table = NULL; | 327 | mod->arch.init_unw_table = NULL; |
327 | } | 328 | } |