um: Fix wait_stub_done() error handling
authorRichard Weinberger <richard@nod.at>
Fri, 17 May 2013 12:21:01 +0000 (14:21 +0200)
committerRichard Weinberger <richard@nod.at>
Fri, 19 Jul 2013 08:45:18 +0000 (10:45 +0200)
If we die within a stub handler we only way to reliable
kill the (obviously) dying uml guest process is killing
it's host twin on the host side.

Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/os-Linux/skas/process.c

index 4625949..441e4ba 100644 (file)
@@ -54,7 +54,7 @@ static int ptrace_dump_regs(int pid)
 
 void wait_stub_done(int pid)
 {
-       int n, status, err;
+       int n, status, err, bad_stop = 0;
 
        while (1) {
                CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED | __WALL));
@@ -74,6 +74,8 @@ void wait_stub_done(int pid)
 
        if (((1 << WSTOPSIG(status)) & STUB_DONE_MASK) != 0)
                return;
+       else
+               bad_stop = 1;
 
 bad_wait:
        err = ptrace_dump_regs(pid);
@@ -83,7 +85,10 @@ bad_wait:
        printk(UM_KERN_ERR "wait_stub_done : failed to wait for SIGTRAP, "
               "pid = %d, n = %d, errno = %d, status = 0x%x\n", pid, n, errno,
               status);
-       fatal_sigsegv();
+       if (bad_stop)
+               kill(pid, SIGKILL);
+       else
+               fatal_sigsegv();
 }
 
 extern unsigned long current_stub_stack(void);