diff options
author | Pedro Alves <palves@redhat.com> | 2014-07-15 16:22:14 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2014-07-15 16:22:14 +0100 |
commit | 57745c903f78ffdb10a6198a6e35e5a1e63ea4b0 (patch) | |
tree | 82abdd289ffc34b014cec9b0225050169732586f /gdb/linux-nat.c | |
parent | 2d40be181fad7aed4aeabafd36529f3684b8bcab (diff) | |
download | gdb-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.c | 24 |
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; } |