On 11/25, Ananth N Mavinakayanahalli wrote:
>
> I ran the ptrace-tests testsuite [1] on powerpc on the vanilla ptrace
> and then with ptrace/utrace. The results for ptrace/utrace look better
> :-)

Great! thanks a lot Ananth for doing this.

ptrace-utrace still fails 2 tests,

> FAIL: syscall-reset

I'll take a look later. Since unpatched kernel fails this test too
I am not going to worry right now. I think this is ppc specific, x86
passes this test.

> step-fork: step-fork.c:56: handler_fail: Assertion `0' failed.
> /bin/sh: line 5: 24803 Aborted                 ${dir}$tst
> FAIL: step-fork

This is expected. Should be fixed by

        ptrace-copy_process-should-disable-stepping.patch

in -mm tree. (I am attaching this patch below just in case)
I din't mention this patch in this series because this bug
is "ortogonal" to utrace/ptrace.

Oleg.

------------------------------------------------------
If the tracee calls fork() after PTRACE_SINGLESTEP, the forked child
starts with TIF_SINGLESTEP/X86_EFLAGS_TF bits copied from ptraced parent.
This is not right, especially when the new child is not auto-attaced: in
this case it is killed by SIGTRAP.

Change copy_process() to call user_disable_single_step(). Tested on x86.

Test-case:

        #include <stdio.h>
        #include <unistd.h>
        #include <signal.h>
        #include <sys/ptrace.h>
        #include <sys/wait.h>
        #include <assert.h>

        int main(void)
        {
                int pid, status;

                if (!(pid = fork())) {
                        assert(ptrace(PTRACE_TRACEME) == 0);
                        kill(getpid(), SIGSTOP);

                        if (!fork()) {
                                /* kernel bug: this child will be killed by 
SIGTRAP */
                                printf("Hello world\n");
                                return 43;
                        }

                        wait(&status);
                        return WEXITSTATUS(status);
                }

                for (;;) {
                        assert(pid == wait(&status));
                        if (WIFEXITED(status))
                                break;
                        assert(ptrace(PTRACE_SINGLESTEP, pid, 0,0) == 0);
                }

                assert(WEXITSTATUS(status) == 43);
                return 0;
        }

Signed-off-by: Oleg Nesterov <o...@redhat.com>
Acked-by: Roland McGrath <rol...@redhat.com>
Signed-off-by: Andrew Morton <a...@linux-foundation.org>
---


diff -puN kernel/fork.c~ptrace-copy_process-should-disable-stepping 
kernel/fork.c
--- a/kernel/fork.c~ptrace-copy_process-should-disable-stepping
+++ a/kernel/fork.c
@@ -1203,9 +1203,10 @@ static struct task_struct *copy_process(
                p->sas_ss_sp = p->sas_ss_size = 0;
 
        /*
-        * Syscall tracing should be turned off in the child regardless
-        * of CLONE_PTRACE.
+        * Syscall tracing and stepping should be turned off in the
+        * child regardless of CLONE_PTRACE.
         */
+       user_disable_single_step(p);
        clear_tsk_thread_flag(p, TIF_SYSCALL_TRACE);
 #ifdef TIF_SYSCALL_EMU
        clear_tsk_thread_flag(p, TIF_SYSCALL_EMU);

Reply via email to