From 57745c903f78ffdb10a6198a6e35e5a1e63ea4b0 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 15 Jul 2014 16:22:14 +0100 Subject: [PATCH] [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 * linux-nat.c (kill_callback): Save errno and work with saved copy. --- gdb/ChangeLog | 5 +++++ gdb/linux-nat.c | 24 ++++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 157dc4933e8..2b6604bf3c6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2014-07-15 Pedro Alves + + * linux-nat.c (kill_callback): Save errno and work with saved + copy. + 2014-07-15 Simon Marchi * expprint.c (dump_subexp_body_standard): Handle OP_STRING. diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 0ab0362f1ec..c738abf9f3e 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; } -- 2.30.2