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