lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <20130103115645.GE8140@linux.vnet.ibm.com> Date: Thu, 3 Jan 2013 17:26:45 +0530 From: Srikar Dronamraju <srikar@...ux.vnet.ibm.com> To: Oleg Nesterov <oleg@...hat.com> Cc: Ingo Molnar <mingo@...e.hu>, Peter Zijlstra <peterz@...radead.org>, Ananth N Mavinakayanahalli <ananth@...ibm.com>, Anton Arapov <anton@...hat.com>, Frank Eigler <fche@...hat.com>, Josh Stone <jistone@...hat.com>, "Suzuki K. Poulose" <suzuki@...ibm.com>, linux-kernel@...r.kernel.org Subject: Re: [PATCH 2/2] uprobes: Reintroduce uprobe_consumer->filter() * Oleg Nesterov <oleg@...hat.com> [2012-12-28 19:13:14]: > Finally add uprobe_consumer->filter() and change consumer_filter() > to actually call this method. > > Note that ->filter() accepts mm_struct, not task_struct. Because: > > 1. We do not have for_each_mm_user(mm, task). > > 2. Even if we implement for_each_mm_user(), ->filter() can > use it itself. > > 3. It is not clear who will actually need this interface to > do the "nontrivial" filtering. > > Another argument is "enum uprobe_filter_ctx", consumer->filter() can > use it to figure out why/where it was called. For example, perhaps > we can add UPROBE_FILTER_PRE_REGISTER used by build_map_info() to > quickly "nack" the unwanted mm's. In this case consumer should know > that it is called under ->i_mmap_mutex. > > See the previous discussion at http://marc.info/?t=135214229700002 > Perhaps we should pass more arguments, vma/vaddr? > > Note: this patch obviously can't help to filter out the child created > by fork(), this will be addressed later. > > Signed-off-by: Oleg Nesterov <oleg@...hat.com> Acked-by: Srikar Dronamraju <srikar@...ux.vnet.ibm.com> > --- > include/linux/uprobes.h | 9 +++++++++ > kernel/events/uprobes.c | 18 +++++++++++------- > 2 files changed, 20 insertions(+), 7 deletions(-) > > diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h > index 83742b9..c2df693 100644 > --- a/include/linux/uprobes.h > +++ b/include/linux/uprobes.h > @@ -35,8 +35,17 @@ struct inode; > # include <asm/uprobes.h> > #endif > > +enum uprobe_filter_ctx { > + UPROBE_FILTER_REGISTER, > + UPROBE_FILTER_UNREGISTER, > + UPROBE_FILTER_MMAP, > +}; > + > struct uprobe_consumer { > int (*handler)(struct uprobe_consumer *self, struct pt_regs *regs); > + bool (*filter)(struct uprobe_consumer *self, > + enum uprobe_filter_ctx ctx, > + struct mm_struct *mm); > > struct uprobe_consumer *next; > }; > diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c > index 60b0a90..e2ebb6f 100644 > --- a/kernel/events/uprobes.c > +++ b/kernel/events/uprobes.c > @@ -579,19 +579,21 @@ static int prepare_uprobe(struct uprobe *uprobe, struct file *file, > return ret; > } > > -static inline bool consumer_filter(struct uprobe_consumer *uc) > +static inline bool consumer_filter(struct uprobe_consumer *uc, > + enum uprobe_filter_ctx ctx, struct mm_struct *mm) > { > - return true; /* TODO: !uc->filter || uc->filter(...) */ > + return !uc->filter || uc->filter(uc, ctx, mm); > } > > -static bool filter_chain(struct uprobe *uprobe) > +static bool filter_chain(struct uprobe *uprobe, > + enum uprobe_filter_ctx ctx, struct mm_struct *mm) > { > struct uprobe_consumer *uc; > bool ret = false; > > down_read(&uprobe->consumer_rwsem); > for (uc = uprobe->consumers; uc; uc = uc->next) { > - ret = consumer_filter(uc); > + ret = consumer_filter(uc, ctx, mm); > if (ret) > break; > } > @@ -772,10 +774,12 @@ static int register_for_each_vma(struct uprobe *uprobe, bool is_register) > > if (is_register) { > /* consult only the "caller", new consumer. */ > - if (consumer_filter(uprobe->consumers)) > + if (consumer_filter(uprobe->consumers, > + UPROBE_FILTER_REGISTER, mm)) > err = install_breakpoint(uprobe, mm, vma, info->vaddr); > } else if (test_bit(MMF_HAS_UPROBES, &mm->flags)) { > - if (!filter_chain(uprobe)) > + if (!filter_chain(uprobe, > + UPROBE_FILTER_UNREGISTER, mm)) > err |= remove_breakpoint(uprobe, mm, info->vaddr); > } > > @@ -968,7 +972,7 @@ int uprobe_mmap(struct vm_area_struct *vma) > */ > list_for_each_entry_safe(uprobe, u, &tmp_list, pending_list) { > if (!fatal_signal_pending(current) && > - filter_chain(uprobe)) { > + filter_chain(uprobe, UPROBE_FILTER_MMAP, vma->vm_mm)) { > unsigned long vaddr = offset_to_vaddr(vma, uprobe->offset); > install_breakpoint(uprobe, vma->vm_mm, vma, vaddr); > } > -- > 1.5.5.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists