aboutsummaryrefslogtreecommitdiff
path: root/gdb/linux-nat.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2014-07-15 16:22:14 +0100
committerPedro Alves <palves@redhat.com>2014-07-15 16:22:14 +0100
commit57745c903f78ffdb10a6198a6e35e5a1e63ea4b0 (patch)
tree82abdd289ffc34b014cec9b0225050169732586f /gdb/linux-nat.c
parent2d40be181fad7aed4aeabafd36529f3684b8bcab (diff)
downloadgdb-57745c903f78ffdb10a6198a6e35e5a1e63ea4b0.zip
gdb-57745c903f78ffdb10a6198a6e35e5a1e63ea4b0.tar.gz
gdb-57745c903f78ffdb10a6198a6e35e5a1e63ea4b0.tar.bz2
[GDB/Linux] Avoid stale errno
The fix that went into GDBserver is also needed on the GDB side. 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 may well clobber errno when we get to evaluate the third argument to fprintf_unfiltered. gdb/ 2014-07-15 Pedro Alves <palves@redhat.com> * linux-nat.c (kill_callback): Save errno and work with saved copy.
Diffstat (limited to 'gdb/linux-nat.c')
-rw-r--r--gdb/linux-nat.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 0ab0362..c738abf 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -3706,20 +3706,28 @@ kill_callback (struct lwp_info *lp, void *data)
errno = 0;
kill (ptid_get_lwp (lp->ptid), SIGKILL);
if (debug_linux_nat)
- fprintf_unfiltered (gdb_stdlog,
- "KC: kill (SIGKILL) %s, 0, 0 (%s)\n",
- target_pid_to_str (lp->ptid),
- errno ? safe_strerror (errno) : "OK");
+ {
+ int save_errno = errno;
+
+ fprintf_unfiltered (gdb_stdlog,
+ "KC: kill (SIGKILL) %s, 0, 0 (%s)\n",
+ target_pid_to_str (lp->ptid),
+ save_errno ? safe_strerror (save_errno) : "OK");
+ }
/* Some kernels ignore even SIGKILL for processes under ptrace. */
errno = 0;
ptrace (PTRACE_KILL, ptid_get_lwp (lp->ptid), 0, 0);
if (debug_linux_nat)
- fprintf_unfiltered (gdb_stdlog,
- "KC: PTRACE_KILL %s, 0, 0 (%s)\n",
- target_pid_to_str (lp->ptid),
- errno ? safe_strerror (errno) : "OK");
+ {
+ int save_errno = errno;
+
+ fprintf_unfiltered (gdb_stdlog,
+ "KC: PTRACE_KILL %s, 0, 0 (%s)\n",
+ target_pid_to_str (lp->ptid),
+ save_errno ? safe_strerror (save_errno) : "OK");
+ }
return 0;
}