uml: work around broken host PTRACE_SYSEMU
PATCH 11/14 uml: work around broken host PTRACE_SYSEMU
From 81b956c3fec06a5091b9e8909724a8afc7fff1bc Mon Sep 17 00:00:00 2001
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]>
Signed-off-by Andrew Morton <[email protected]>
Signed-off-by Linus Torvalds <[email protected]>
--- arch/um/os-Linux/start_up.c | 25 ++++++++++++++++--------- 1 files changed, 16 insertions(+), 9 deletions(-)
arch/um/os-Linux/start_up.c +16 -9
@@ -122,8 +122,10 @@ static int stop_ptraced_child(int pid, int exitcode, int mustexit) {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);
@@ -203,7 +205,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 )
@@ -245,9 +247,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 )
@@ -257,9 +261,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;
Signature · 12 lines
1.5.5.1 ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ User-mode-linux-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel