Messages in this thread Patch in this message | | | Date | Mon, 9 Sep 2013 10:36:35 +0200 | From | Anton Arapov <> | Subject | Re: [PATCH] uprobes: Fix limiting un-nested return probes |
| |
On Sun, Sep 08, 2013 at 06:32:32PM +0200, Oleg Nesterov wrote: > Sorry for delay, vacation. > > On 09/03, Hemant Kumar Shaw wrote: > > > > There exists a limit to the number of nested return probes. The current limit is 64. > > However this limit is getting enforced on even non nested return probes. > > Hence, registering 64 independent non nested return probes results in failure of > > return probes on the same task. The problem is utask->depth is getting incremented > > unconditionally but decremented only if chained. > > Hmm. I'll try to recheck later, but at first glance this logic is indeed > wrong, thanks. > > > --- a/kernel/events/uprobes.c > > +++ b/kernel/events/uprobes.c > > @@ -1442,7 +1442,8 @@ static void prepare_uretprobe(struct uprobe *uprobe, struct pt_regs *regs) > > ri->orig_ret_vaddr = orig_ret_vaddr; > > ri->chained = chained; > > > > - utask->depth++; > > + if (chained) > > + utask->depth++; > > Not sure, but I can be easily wrong... afaics we need something like below, no? > Anton?
Oleg, your guess is correct.
My original intention was to limit by depth the chained only probes. But later, after your review, we've decided /based on safety concerns/ to limit it hard.
The decrement 'utask->depth--;' in my own tree is above the 'if (!chained)' check. I think it got mangled somehow when I rebased the code before I sent it to lkml.
Anton.
> Oleg. > > --- x/kernel/events/uprobes.c > +++ x/kernel/events/uprobes.c > @@ -1682,12 +1682,10 @@ static bool handle_trampoline(struct pt_ > tmp = ri; > ri = ri->next; > kfree(tmp); > + utask->depth--; > > if (!chained) > break; > - > - utask->depth--; > - > BUG_ON(!ri); > }
| |