[GDBserver] Avoid stale errno
authorPedro Alves <palves@redhat.com>
Tue, 15 Jul 2014 14:35:28 +0000 (15:35 +0100)
committerPedro Alves <palves@redhat.com>
Tue, 15 Jul 2014 14:35:28 +0000 (15:35 +0100)
Although most compilers follow right-to-left evaluation order, the
order of evaluation of a function call's arguments is really
unspecified.  target_pid_to_str or ptid_of may well clobber errno when
we get to evaluate the third argument to debug_printf.

gdb/gdbserver/
2014-07-15  Pedro Alves  <palves@redhat.com>

* linux-low.c (linux_kill_one_lwp): Save errno and work with saved
copy.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c

index e6b0a8414ce3a8f27c9599cd688faa1002a6ca63..4658abfa78890b9d7fd75bb79938b919173efd51 100644 (file)
@@ -1,3 +1,8 @@
+2014-07-15  Pedro Alves  <palves@redhat.com>
+
+       * linux-low.c (linux_kill_one_lwp): Save errno and work with saved
+       copy.
+
 2014-07-11  Pedro Alves  <palves@redhat.com>
 
        * linux-low.c (kill_wait_lwp): New function, based on
index 215a80cee16fcc7ecf7a44ad4e399505618ac0ec..0f4dbe2ebbc037fccb71efc348250967e9302268 100644 (file)
@@ -897,16 +897,24 @@ linux_kill_one_lwp (struct lwp_info *lwp)
   errno = 0;
   kill (pid, SIGKILL);
   if (debug_threads)
-    debug_printf ("LKL:  kill (SIGKILL) %s, 0, 0 (%s)\n",
-                 target_pid_to_str (ptid_of (thr)),
-                 errno ? strerror (errno) : "OK");
+    {
+      int save_errno = errno;
+
+      debug_printf ("LKL:  kill_lwp (SIGKILL) %s, 0, 0 (%s)\n",
+                   target_pid_to_str (ptid_of (thr)),
+                   save_errno ? strerror (save_errno) : "OK");
+    }
 
   errno = 0;
   ptrace (PTRACE_KILL, pid, (PTRACE_TYPE_ARG3) 0, (PTRACE_TYPE_ARG4) 0);
   if (debug_threads)
-    debug_printf ("LKL:  PTRACE_KILL %s, 0, 0 (%s)\n",
-                 target_pid_to_str (ptid_of (thr)),
-                 errno ? strerror (errno) : "OK");
+    {
+      int save_errno = errno;
+
+      debug_printf ("LKL:  PTRACE_KILL %s, 0, 0 (%s)\n",
+                   target_pid_to_str (ptid_of (thr)),
+                   save_errno ? strerror (save_errno) : "OK");
+    }
 }
 
 /* Kill LWP and wait for it to die.  */