| From d496aab567e7e52b3e974c9192a5de6e77dce32c Mon Sep 17 00:00:00 2001 |
| From: Ananth N Mavinakayanahalli <ananth@in.ibm.com> |
| Date: Fri, 20 Jan 2012 14:34:04 -0800 |
| Subject: kprobes: initialize before using a hlist |
| |
| From: Ananth N Mavinakayanahalli <ananth@in.ibm.com> |
| |
| commit d496aab567e7e52b3e974c9192a5de6e77dce32c upstream. |
| |
| Commit ef53d9c5e ("kprobes: improve kretprobe scalability with hashed |
| locking") introduced a bug where we can potentially leak |
| kretprobe_instances since we initialize a hlist head after having used |
| it. |
| |
| Initialize the hlist head before using it. |
| |
| Reported by: Jim Keniston <jkenisto@us.ibm.com> |
| Acked-by: Jim Keniston <jkenisto@us.ibm.com> |
| Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> |
| Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> |
| Cc: Srinivasa D S <srinivasa@in.ibm.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| kernel/kprobes.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/kernel/kprobes.c |
| +++ b/kernel/kprobes.c |
| @@ -466,6 +466,7 @@ void __kprobes kprobe_flush_task(struct |
| /* Early boot. kretprobe_table_locks not yet initialized. */ |
| return; |
| |
| + INIT_HLIST_HEAD(&empty_rp); |
| hash = hash_ptr(tk, KPROBE_HASH_BITS); |
| head = &kretprobe_inst_table[hash]; |
| kretprobe_table_lock(hash, &flags); |
| @@ -474,7 +475,6 @@ void __kprobes kprobe_flush_task(struct |
| recycle_rp_inst(ri, &empty_rp); |
| } |
| kretprobe_table_unlock(hash, &flags); |
| - INIT_HLIST_HEAD(&empty_rp); |
| hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { |
| hlist_del(&ri->hlist); |
| kfree(ri); |