Hi Oleg, 

> 
> --- PU/kernel/ptrace.c~09_MV_PTRACE_CK        2009-08-19 16:49:25.000000000 
> +0200
> +++ PU/kernel/ptrace.c        2009-08-20 20:04:59.000000000 +0200
> @@ -471,35 +471,47 @@ static int ptrace_attach_task(struct tas
>  {
>       struct utrace_engine *engine;
>       unsigned long events;
> +     int err = -EPERM;
> 
>       engine = utrace_attach_task(tracee, UTRACE_ATTACH_CREATE |
>                                               UTRACE_ATTACH_EXCLUSIVE |
>                                               UTRACE_ATTACH_MATCH_OPS,
>                                               &ptrace_utrace_ops, NULL);
>       if (unlikely(IS_ERR(engine))) {
> -             int err = PTR_ERR(engine);
> -             if (err != -ESRCH && err != -ERESTARTNOINTR)
> -                     err = -EPERM ;
> +             if (PTR_ERR(engine) == -ESRCH ||
> +                 PTR_ERR(engine) == -ERESTARTNOINTR)
> +                     err = PTR_ERR(engine);
>               return err;
>       }
> +
>       /*
> -      * We need QUIESCE for resume handling, CLONE to check
> -      * for CLONE_PTRACE, other events are always reported.
> -      */
> -     events = UTRACE_EVENT(QUIESCE) | UTRACE_EVENT(CLONE) |
> -              UTRACE_EVENT(EXEC) | UTRACE_EVENT_SIGNAL_ALL;
> -     /*
> -      * It can fail only if the tracee is dead, the caller
> -      * must notice this before setting PT_PTRACED.
> +      * Check ->ptrace to make sure we don't race with the previous
> +      * tracer which didn't finish detach. If it is clear, nobody
> +      * can change it except us due to UTRACE_ATTACH_EXCLUSIVE.
>        */
> -     utrace_set_events(tracee, engine, events);


> +     if (unlikely(tracee->ptrace)) {

Any reason why we cant move this check before we do utrace_attach_task?

> +             utrace_control(tracee, engine, UTRACE_DETACH);

--
Thanks and Regards
Srikar

Reply via email to