diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/common/linux-ptrace.c | 38 |
2 files changed, 21 insertions, 23 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d88f65c..5dbee6b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2013-03-10 Jan Kratochvil <jan.kratochvil@redhat.com> + * common/linux-ptrace.c (linux_ptrace_test_ret_to_nx): Call also kill + for CHILD, ignore PTRACE_KILL errors, move the inner block variable + kill_status to outer block. + +2013-03-10 Jan Kratochvil <jan.kratochvil@redhat.com> + Fix entry-values if the callee called a noreturn function. * dwarf2-frame-tailcall.c (dwarf2_tailcall_sniffer_first): Use get_frame_address_in_block. Add new comment. diff --git a/gdb/common/linux-ptrace.c b/gdb/common/linux-ptrace.c index e1001c6..d5ac061 100644 --- a/gdb/common/linux-ptrace.c +++ b/gdb/common/linux-ptrace.c @@ -74,7 +74,7 @@ linux_ptrace_test_ret_to_nx (void) pid_t child, got_pid; gdb_byte *return_address, *pc; long l; - int status; + int status, kill_status; return_address = mmap (NULL, 2, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); @@ -177,32 +177,24 @@ linux_ptrace_test_ret_to_nx (void) } pc = (void *) (uintptr_t) l; - if (ptrace (PTRACE_KILL, child, NULL, NULL) != 0) + kill (child, SIGKILL); + ptrace (PTRACE_KILL, child, NULL, NULL); + + errno = 0; + got_pid = waitpid (child, &kill_status, 0); + if (got_pid != child) { - warning (_("linux_ptrace_test_ret_to_nx: Cannot PTRACE_KILL: %s"), - strerror (errno)); + warning (_("linux_ptrace_test_ret_to_nx: " + "PTRACE_KILL waitpid returned %ld: %s"), + (long) got_pid, strerror (errno)); return; } - else + if (!WIFSIGNALED (kill_status)) { - int kill_status; - - errno = 0; - got_pid = waitpid (child, &kill_status, 0); - if (got_pid != child) - { - warning (_("linux_ptrace_test_ret_to_nx: " - "PTRACE_KILL waitpid returned %ld: %s"), - (long) got_pid, strerror (errno)); - return; - } - if (!WIFSIGNALED (kill_status)) - { - warning (_("linux_ptrace_test_ret_to_nx: " - "PTRACE_KILL status %d is not WIFSIGNALED!"), - status); - return; - } + warning (_("linux_ptrace_test_ret_to_nx: " + "PTRACE_KILL status %d is not WIFSIGNALED!"), + status); + return; } /* + 1 is there as x86* stops after the 'int3' instruction. */ |