vserver 1.9.5.x5
[linux-2.6.git] / arch / um / kernel / tt / exec_user.c
index 35d1082..26a120a 100644 (file)
 #include <errno.h>
 #include <sys/wait.h>
 #include <sys/ptrace.h>
+#include <linux/ptrace.h>
 #include <signal.h>
 #include "user_util.h"
 #include "kern_util.h"
 #include "user.h"
 #include "ptrace_user.h"
+#include "os.h"
 
 void do_exec(int old_pid, int new_pid)
 {
        unsigned long regs[FRAME_SIZE];
+       int err;
 
        if((ptrace(PTRACE_ATTACH, new_pid, 0, 0) < 0) ||
-          (ptrace(PTRACE_CONT, new_pid, 0, 0) < 0) ||
-          (waitpid(new_pid, 0, WUNTRACED) < 0))
+          (ptrace(PTRACE_CONT, new_pid, 0, 0) < 0))
                tracer_panic("do_exec failed to attach proc - errno = %d",
                             errno);
 
+       CATCH_EINTR(err = waitpid(new_pid, 0, WUNTRACED));
+       if (err < 0)
+               tracer_panic("do_exec failed to attach proc in waitpid - errno = %d",
+                            errno);
+
        if(ptrace_getregs(old_pid, regs) < 0)
                tracer_panic("do_exec failed to get registers - errno = %d",
                             errno);
 
-       kill(old_pid, SIGKILL);
+       os_kill_ptraced_process(old_pid, 0);
+
+       if (ptrace(PTRACE_OLDSETOPTIONS, new_pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
+               tracer_panic("do_exec: PTRACE_SETOPTIONS failed, errno = %d", errno);
 
        if(ptrace_setregs(new_pid, regs) < 0)
                tracer_panic("do_exec failed to start new proc - errno = %d",