This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] common/ call also SIGKILL before PTRACE_KILL


Hi,

as discussed recently in "btrace, x86: disable on some processors" and as
patched before:
	[patch] Re: [BUG] gdb: quit hangs after step into signal handler
	http://sourceware.org/ml/archer/2011-q1/msg00102.html

I have also applied SIGKILL before PTRACE_KILL; although it does not happen
here as inferior is not under PTRACE_SINGLESTEP.


Jan


gdb/
2013-02-24  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.

diff --git a/gdb/common/linux-ptrace.c b/gdb/common/linux-ptrace.c
index 886be80..fb41ccf 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.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]