UML - Work around broken host PTRACE_SYSEMU
PATCH 2/2 UML - Work around broken host PTRACE_SYSEMU
Fedora broke PTRACE_SYSEMU again, and UML crashes as a result when it doesn't need to. This patch makes the PTRACE_SYSEMU check fail gracefully and makes UML fall back to PTRACE_SYSCALL.
Signed-off-by Jeff Dike <[email protected]>
--- arch/um/os-Linux/start_up.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-)
arch/um/os-Linux/start_up.c +16 -9
@@ -121,8 +121,10 @@ static int stop_ptraced_child(int pid, i {int status, n, ret =0 ; -if (ptrace (PTRACE_CONT , pid,0 ,0 ) <0 ) -fatal_perror ("stop_ptraced_child : ptrace failed" ); +if (ptrace (PTRACE_CONT , pid,0 ,0 ) <0 ) { +perror ("stop_ptraced_child : ptrace failed" ); +return -1 ; + }CATCH_EINTR (n =waitpid (pid, &status,0 ));if (!WIFEXITED (status) || (WEXITSTATUS (status) != exitcode)) {int exit_with =WEXITSTATUS (status);
@@ -212,7 +214,7 @@ static void __init check_sysemu(void)if (n <0 )fatal_perror ("check_sysemu : wait failed" );if (!WIFSTOPPED (status) || (WSTOPSIG (status) !=SIGTRAP )) -fatal ("check_sysemu : expected SIGTRAP, got status = %d" , +fatal ("check_sysemu : expected SIGTRAP, got status = %d\n" , status);if (ptrace (PTRACE_GETREGS , pid,0 , regs) <0 )
@@ -254,9 +256,11 @@ static void __init check_sysemu(void)if (WIFSTOPPED (status) && (WSTOPSIG (status) == (SIGTRAP |0x80 ))) { -if (!count) -fatal ("check_ptrace : SYSEMU_SINGLESTEP " -"doesn't singlestep" ); +if (!count) { +non_fatal ("check_ptrace : SYSEMU_SINGLESTEP " +"doesn't singlestep" ); + goto fail; + } n =ptrace (PTRACE_POKEUSR , pid,PT_SYSCALL_RET_OFFSET ,os_getpid ());if (n <0 )
@@ -266,9 +270,12 @@ static void __init check_sysemu(void) }else if (WIFSTOPPED (status) && (WSTOPSIG (status) ==SIGTRAP )) count++; -else -fatal ("check_ptrace : expected SIGTRAP or " -"(SIGTRAP | 0x80), got status = %d" , status); +else { +non_fatal ("check_ptrace : expected SIGTRAP or " +"(SIGTRAP | 0x80), got status = %d\n" , + status); + goto fail; + } }if (stop_ptraced_child (pid,0 ,0 ) <0 ) goto fail_stopped;
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel