diff options
author | Ananth N. Mavinakayanahalli <ananth@in.ibm.com> | 2005-03-30 16:39:59 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-03-30 16:39:59 -0800 |
commit | e913ca69163f247ac21b581486a011a2d4830e78 (patch) | |
tree | add1868734bdfce99a0958b24e0a91e8bf2be100 | |
parent | 089c43f12337dc12d1fc79ee243e3e11467ef29d (diff) | |
download | history-e913ca69163f247ac21b581486a011a2d4830e78.tar.gz |
[PATCH] kprobe_handler should check pre_handler function
The kprobe_handler() code currently does not check if a pre_handler is
registered for the kprobe under process. This leads to a NULL pointer
dereference in cases when a module does not define a pre_handler.
The patch corrects the issue by explicitly checking that the pre_handler is
not NULL before it is invoked.
Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | arch/i386/kernel/kprobes.c | 7 | ||||
-rw-r--r-- | arch/ppc64/kernel/kprobes.c | 3 | ||||
-rw-r--r-- | arch/sparc64/kernel/kprobes.c | 2 | ||||
-rw-r--r-- | arch/x86_64/kernel/kprobes.c | 7 |
4 files changed, 8 insertions, 11 deletions
diff --git a/arch/i386/kernel/kprobes.c b/arch/i386/kernel/kprobes.c index f74b755704c4c0..82776ab94e3ab8 100644 --- a/arch/i386/kernel/kprobes.c +++ b/arch/i386/kernel/kprobes.c @@ -159,17 +159,16 @@ static int kprobe_handler(struct pt_regs *regs) if (is_IF_modifier(p->opcode)) kprobe_saved_eflags &= ~IF_MASK; - if (p->pre_handler(p, regs)) { + if (p->pre_handler && p->pre_handler(p, regs)) /* handler has already set things up, so skip ss setup */ return 1; - } - ss_probe: +ss_probe: prepare_singlestep(p, regs); kprobe_status = KPROBE_HIT_SS; return 1; - no_kprobe: +no_kprobe: preempt_enable_no_resched(); return ret; } diff --git a/arch/ppc64/kernel/kprobes.c b/arch/ppc64/kernel/kprobes.c index 4f5c16d4cc6dd6..ba524723c6b949 100644 --- a/arch/ppc64/kernel/kprobes.c +++ b/arch/ppc64/kernel/kprobes.c @@ -128,10 +128,9 @@ static inline int kprobe_handler(struct pt_regs *regs) kprobe_status = KPROBE_HIT_ACTIVE; current_kprobe = p; kprobe_saved_msr = regs->msr; - if (p->pre_handler(p, regs)) { + if (p->pre_handler && p->pre_handler(p, regs)) /* handler has already set things up, so skip ss setup */ return 1; - } ss_probe: prepare_singlestep(p, regs); diff --git a/arch/sparc64/kernel/kprobes.c b/arch/sparc64/kernel/kprobes.c index 7d97138f5d2e65..491bf28a4370de 100644 --- a/arch/sparc64/kernel/kprobes.c +++ b/arch/sparc64/kernel/kprobes.c @@ -128,7 +128,7 @@ static int kprobe_handler(struct pt_regs *regs) kprobe_status = KPROBE_HIT_ACTIVE; current_kprobe = p; - if (p->pre_handler(p, regs)) + if (p->pre_handler && p->pre_handler(p, regs)) return 1; ss_probe: diff --git a/arch/x86_64/kernel/kprobes.c b/arch/x86_64/kernel/kprobes.c index d265450f55fea9..87f43dd7878f3c 100644 --- a/arch/x86_64/kernel/kprobes.c +++ b/arch/x86_64/kernel/kprobes.c @@ -293,17 +293,16 @@ int kprobe_handler(struct pt_regs *regs) if (is_IF_modifier(p->ainsn.insn)) kprobe_saved_rflags &= ~IF_MASK; - if (p->pre_handler(p, regs)) { + if (p->pre_handler && p->pre_handler(p, regs)) /* handler has already set things up, so skip ss setup */ return 1; - } - ss_probe: +ss_probe: prepare_singlestep(p, regs); kprobe_status = KPROBE_HIT_SS; return 1; - no_kprobe: +no_kprobe: preempt_enable_no_resched(); return ret; } |