On 01/09, Anton Arapov wrote:
>
> todo:
>   protect uprobe

Yep ;)

>  static struct uprobe_task *get_utask(void)
>  {
> -     if (!current->utask)
> +     if (!current->utask) {
>               current->utask = kzalloc(sizeof(struct uprobe_task), 
> GFP_KERNEL);
> +             INIT_HLIST_HEAD(&current->utask->return_uprobes);

What if kzalloc() fails?

> +static void prepare_uretprobe(struct uprobe *uprobe, struct pt_regs *regs)
> +{
> +     struct return_uprobe_i *ri;
> +     struct uprobe_task *utask;
> +     struct xol_area *area;
> +     unsigned long rp_trampoline_vaddr = 0;
> +
> +     area = get_xol_area();
> +     if (area)
> +             rp_trampoline_vaddr = area->rp_trampoline_vaddr;
> +     if (!rp_trampoline_vaddr) {
> +             rp_trampoline_vaddr = xol_get_trampoline_slot();

This is obviously racy. But again, so far I think we can simply remove
this.

>  static void handler_chain(struct uprobe *uprobe, struct pt_regs *regs)
>  {
> +     int rc = 0;
>       struct uprobe_consumer *uc;
>       int remove = UPROBE_HANDLER_REMOVE;
>  
>       down_read(&uprobe->register_rwsem);
>       for (uc = uprobe->consumers; uc; uc = uc->next) {
> -             int rc = uc->handler(uc, regs);
> +             if (uc->handler)
> +                     rc = uc->handler(uc, regs);
> +
> +             if (uc->rp_handler)
> +                     prepare_uretprobe(uprobe, regs); /* put bp at return */

This doesn't look right. prepare_uretprobe() should not be called
multiple times.

Oleg.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to