linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] kprobes: Fix kill kprobe which has been marked as gone
@ 2020-08-20  3:19 Muchun Song
  2020-08-21 12:28 ` Masami Hiramatsu
  0 siblings, 1 reply; 4+ messages in thread
From: Muchun Song @ 2020-08-20  3:19 UTC (permalink / raw)
  To: naveen.n.rao, anil.s.keshavamurthy, davem, mhiramat, songliubraving
  Cc: linux-kernel, Muchun Song, Chengming Zhou

If a kprobe is marked as gone, we should not kill it again. Otherwise,
we can disarm the kprobe more than once. In that case, the statistics
of kprobe_ftrace_enabled can unbalance which can lead to that kprobe
do not work.

Fixes: 0cb2f1372baa ("kprobes: Fix NULL pointer dereference at kprobe_ftrace_handler")
Signed-off-by: Muchun Song <songmuchun@bytedance.com>
Co-developed-by: Chengming Zhou <zhouchengming@bytedance.com>
Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
---
 kernel/kprobes.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index d36e2b017588..7bac3ea44ff4 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -2422,7 +2422,10 @@ static int kprobes_module_callback(struct notifier_block *nb,
 	mutex_lock(&kprobe_mutex);
 	for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
 		head = &kprobe_table[i];
-		hlist_for_each_entry(p, head, hlist)
+		hlist_for_each_entry(p, head, hlist) {
+			if (kprobe_gone(p))
+				continue;
+
 			if (within_module_init((unsigned long)p->addr, mod) ||
 			    (checkcore &&
 			     within_module_core((unsigned long)p->addr, mod))) {
@@ -2439,6 +2442,7 @@ static int kprobes_module_callback(struct notifier_block *nb,
 				 */
 				kill_kprobe(p);
 			}
+		}
 	}
 	if (val == MODULE_STATE_GOING)
 		remove_module_kprobe_blacklist(mod);
-- 
2.11.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] kprobes: Fix kill kprobe which has been marked as gone
  2020-08-20  3:19 [PATCH] kprobes: Fix kill kprobe which has been marked as gone Muchun Song
@ 2020-08-21 12:28 ` Masami Hiramatsu
  2020-08-21 13:28   ` Masami Hiramatsu
  0 siblings, 1 reply; 4+ messages in thread
From: Masami Hiramatsu @ 2020-08-21 12:28 UTC (permalink / raw)
  To: Muchun Song
  Cc: naveen.n.rao, anil.s.keshavamurthy, davem, songliubraving,
	linux-kernel, Chengming Zhou

Hi Muchun,

On Thu, 20 Aug 2020 11:19:33 +0800
Muchun Song <songmuchun@bytedance.com> wrote:

> If a kprobe is marked as gone, we should not kill it again. Otherwise,
> we can disarm the kprobe more than once. In that case, the statistics
> of kprobe_ftrace_enabled can unbalance which can lead to that kprobe
> do not work.
> 

Good catch! Hmm, I think we also need an assertion in
kill_kprobe() so that p is already gone. Anyway, this looks good to me.

Acked-by: Masami Hiramatsu <mhiramat@kernel.org>

Thanks!

> Fixes: 0cb2f1372baa ("kprobes: Fix NULL pointer dereference at kprobe_ftrace_handler")
> Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> Co-developed-by: Chengming Zhou <zhouchengming@bytedance.com>
> Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
> ---
>  kernel/kprobes.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/kprobes.c b/kernel/kprobes.c
> index d36e2b017588..7bac3ea44ff4 100644
> --- a/kernel/kprobes.c
> +++ b/kernel/kprobes.c
> @@ -2422,7 +2422,10 @@ static int kprobes_module_callback(struct notifier_block *nb,
>  	mutex_lock(&kprobe_mutex);
>  	for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
>  		head = &kprobe_table[i];
> -		hlist_for_each_entry(p, head, hlist)
> +		hlist_for_each_entry(p, head, hlist) {
> +			if (kprobe_gone(p))
> +				continue;
> +
>  			if (within_module_init((unsigned long)p->addr, mod) ||
>  			    (checkcore &&
>  			     within_module_core((unsigned long)p->addr, mod))) {
> @@ -2439,6 +2442,7 @@ static int kprobes_module_callback(struct notifier_block *nb,
>  				 */
>  				kill_kprobe(p);
>  			}
> +		}
>  	}
>  	if (val == MODULE_STATE_GOING)
>  		remove_module_kprobe_blacklist(mod);
> -- 
> 2.11.0
> 


-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] kprobes: Fix kill kprobe which has been marked as gone
  2020-08-21 12:28 ` Masami Hiramatsu
@ 2020-08-21 13:28   ` Masami Hiramatsu
  2020-08-22  2:31     ` [External] " Muchun Song
  0 siblings, 1 reply; 4+ messages in thread
From: Masami Hiramatsu @ 2020-08-21 13:28 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Muchun Song, naveen.n.rao, anil.s.keshavamurthy, davem,
	songliubraving, linux-kernel, Chengming Zhou

On Fri, 21 Aug 2020 21:28:43 +0900
Masami Hiramatsu <mhiramat@kernel.org> wrote:

> Hi Muchun,
> 
> On Thu, 20 Aug 2020 11:19:33 +0800
> Muchun Song <songmuchun@bytedance.com> wrote:
> 
> > If a kprobe is marked as gone, we should not kill it again. Otherwise,
> > we can disarm the kprobe more than once. In that case, the statistics
> > of kprobe_ftrace_enabled can unbalance which can lead to that kprobe
> > do not work.
> > 
> 
> Good catch! Hmm, I think we also need an assertion in
> kill_kprobe() so that p is already gone. Anyway, this looks good to me.
> 
> Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
> 
> Thanks!
> 
> > Fixes: 0cb2f1372baa ("kprobes: Fix NULL pointer dereference at kprobe_ftrace_handler")

BTW, this fixes older bug than this commit.

Fixes: e8386a0cb22f ("kprobes: support probing module __exit function")

Thank you,

> > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> > Co-developed-by: Chengming Zhou <zhouchengming@bytedance.com>
> > Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
> > ---
> >  kernel/kprobes.c | 6 +++++-
> >  1 file changed, 5 insertions(+), 1 deletion(-)
> > 
> > diff --git a/kernel/kprobes.c b/kernel/kprobes.c
> > index d36e2b017588..7bac3ea44ff4 100644
> > --- a/kernel/kprobes.c
> > +++ b/kernel/kprobes.c
> > @@ -2422,7 +2422,10 @@ static int kprobes_module_callback(struct notifier_block *nb,
> >  	mutex_lock(&kprobe_mutex);
> >  	for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
> >  		head = &kprobe_table[i];
> > -		hlist_for_each_entry(p, head, hlist)
> > +		hlist_for_each_entry(p, head, hlist) {
> > +			if (kprobe_gone(p))
> > +				continue;
> > +
> >  			if (within_module_init((unsigned long)p->addr, mod) ||
> >  			    (checkcore &&
> >  			     within_module_core((unsigned long)p->addr, mod))) {
> > @@ -2439,6 +2442,7 @@ static int kprobes_module_callback(struct notifier_block *nb,
> >  				 */
> >  				kill_kprobe(p);
> >  			}
> > +		}
> >  	}
> >  	if (val == MODULE_STATE_GOING)
> >  		remove_module_kprobe_blacklist(mod);
> > -- 
> > 2.11.0
> > 
> 
> 
> -- 
> Masami Hiramatsu <mhiramat@kernel.org>


-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [External] Re: [PATCH] kprobes: Fix kill kprobe which has been marked as gone
  2020-08-21 13:28   ` Masami Hiramatsu
@ 2020-08-22  2:31     ` Muchun Song
  0 siblings, 0 replies; 4+ messages in thread
From: Muchun Song @ 2020-08-22  2:31 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: naveen.n.rao, anil.s.keshavamurthy, davem, songliubraving, LKML,
	Chengming Zhou

On Fri, Aug 21, 2020 at 9:28 PM Masami Hiramatsu <mhiramat@kernel.org> wrote:
>
> On Fri, 21 Aug 2020 21:28:43 +0900
> Masami Hiramatsu <mhiramat@kernel.org> wrote:
>
> > Hi Muchun,
> >
> > On Thu, 20 Aug 2020 11:19:33 +0800
> > Muchun Song <songmuchun@bytedance.com> wrote:
> >
> > > If a kprobe is marked as gone, we should not kill it again. Otherwise,
> > > we can disarm the kprobe more than once. In that case, the statistics
> > > of kprobe_ftrace_enabled can unbalance which can lead to that kprobe
> > > do not work.
> > >
> >
> > Good catch! Hmm, I think we also need an assertion in
> > kill_kprobe() so that p is already gone. Anyway, this looks good to me.
> >
> > Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
> >
> > Thanks!
> >
> > > Fixes: 0cb2f1372baa ("kprobes: Fix NULL pointer dereference at kprobe_ftrace_handler")
>
> BTW, this fixes older bug than this commit.
>
> Fixes: e8386a0cb22f ("kprobes: support probing module __exit function")

Yeah, it's right. Thanks.

>
> Thank you,
>
> > > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> > > Co-developed-by: Chengming Zhou <zhouchengming@bytedance.com>
> > > Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
> > > ---
> > >  kernel/kprobes.c | 6 +++++-
> > >  1 file changed, 5 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/kernel/kprobes.c b/kernel/kprobes.c
> > > index d36e2b017588..7bac3ea44ff4 100644
> > > --- a/kernel/kprobes.c
> > > +++ b/kernel/kprobes.c
> > > @@ -2422,7 +2422,10 @@ static int kprobes_module_callback(struct notifier_block *nb,
> > >     mutex_lock(&kprobe_mutex);
> > >     for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
> > >             head = &kprobe_table[i];
> > > -           hlist_for_each_entry(p, head, hlist)
> > > +           hlist_for_each_entry(p, head, hlist) {
> > > +                   if (kprobe_gone(p))
> > > +                           continue;
> > > +
> > >                     if (within_module_init((unsigned long)p->addr, mod) ||
> > >                         (checkcore &&
> > >                          within_module_core((unsigned long)p->addr, mod))) {
> > > @@ -2439,6 +2442,7 @@ static int kprobes_module_callback(struct notifier_block *nb,
> > >                              */
> > >                             kill_kprobe(p);
> > >                     }
> > > +           }
> > >     }
> > >     if (val == MODULE_STATE_GOING)
> > >             remove_module_kprobe_blacklist(mod);
> > > --
> > > 2.11.0
> > >
> >
> >
> > --
> > Masami Hiramatsu <mhiramat@kernel.org>
>
>
> --
> Masami Hiramatsu <mhiramat@kernel.org>



-- 
Yours,
Muchun

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-08-22  2:32 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-20  3:19 [PATCH] kprobes: Fix kill kprobe which has been marked as gone Muchun Song
2020-08-21 12:28 ` Masami Hiramatsu
2020-08-21 13:28   ` Masami Hiramatsu
2020-08-22  2:31     ` [External] " Muchun Song

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).