On Tue, 31 Jan 2012 00:10:12 +0800
Jiang Liu <[email protected]> wrote:

> In function pre_handler_kretprobe(), the allocated kretprobe_instance object
> will get leaked if the entry_handler callback returns non-zero. This may cause
> all the preallocated kretprobe_instance objects exhausted. This issue could be
> reproduced by changing samples/kprobes/kretprobe_example.c to probe
> "mutex_unlock". And the fix is straight forward, just put the allocated
> kretprobe_instance object back onto the free_instances list.
> 
> Signed-off-by: Jiang Liu <[email protected]>
> Acked-by: Jim Keniston <[email protected]>
> Acked-by: Ananth N Mavinakayanahalli <[email protected]>
> CC: Masami Hiramatsu <[email protected]>
> CC: Anil S Keshavamurthy <[email protected]>
> CC: "David S. Miller" <[email protected]>
> CC: [email protected]
> ---
>  kernel/kprobes.c |    6 +++++-
>  1 files changed, 5 insertions(+), 1 deletions(-)
> 
> diff --git a/kernel/kprobes.c b/kernel/kprobes.c
> index e5d8464..2423295 100644
> --- a/kernel/kprobes.c
> +++ b/kernel/kprobes.c
> @@ -1673,8 +1673,12 @@ static int __kprobes pre_handler_kretprobe(struct 
> kprobe *p,
>               ri->rp = rp;
>               ri->task = current;
>  
> -             if (rp->entry_handler && rp->entry_handler(ri, regs))
> +             if (rp->entry_handler && rp->entry_handler(ri, regs)) {
> +                     spin_lock_irqsave(&rp->lock, flags);
> +                     hlist_add_head(&ri->hlist, &rp->free_instances);
> +                     spin_unlock_irqrestore(&rp->lock, flags);
>                       return 0;
> +             }
>  

kernel/kprobes.c: In function 'pre_handler_kretprobe':
kernel/kprobes.c:1677: warning: passing argument 1 of 'spinlock_check' from 
incompatible pointer type
include/linux/spinlock.h:272: note: expected 'struct spinlock_t *' but argument 
is of type 'struct raw_spinlock_t *'
kernel/kprobes.c:1679: warning: passing argument 1 of 'spin_unlock_irqrestore' 
from incompatible pointer type
include/linux/spinlock.h:338: note: expected 'struct spinlock_t *' but argument 
is of type 'struct raw_spinlock_t *'

--- 
a/kernel/kprobes.c~kprobes-fix-a-memory-leak-in-function-pre_handler_kretprobe-fix
+++ a/kernel/kprobes.c
@@ -1674,9 +1674,9 @@ static int __kprobes pre_handler_kretpro
                ri->task = current;
 
                if (rp->entry_handler && rp->entry_handler(ri, regs)) {
-                       spin_lock_irqsave(&rp->lock, flags);
+                       raw_spin_lock_irqsave(&rp->lock, flags);
                        hlist_add_head(&ri->hlist, &rp->free_instances);
-                       spin_unlock_irqrestore(&rp->lock, flags);
+                       raw_spin_unlock_irqrestore(&rp->lock, flags);
                        return 0;
                }
 

I'm surprised you didn't notice the warning spew.  How well tested is
this code?

--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to