aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2024-12-13 18:36:34 +0100
committerTom de Vries <tdevries@suse.de>2024-12-13 18:36:34 +0100
commit2e792a78e495be6df4b8c0a3e41332c2f6dcd911 (patch)
tree96610bcb63f974158805a0a887d7802cdd58725e
parent7336a8977d81b7b8c00f2e8ccb8a084afb33b19a (diff)
downloadbinutils-2e792a78e495be6df4b8c0a3e41332c2f6dcd911.zip
binutils-2e792a78e495be6df4b8c0a3e41332c2f6dcd911.tar.gz
binutils-2e792a78e495be6df4b8c0a3e41332c2f6dcd911.tar.bz2
[gdb] Fix tsan warning: signal handler spoils errno
When building gdb with -fsanitize=thread and running test-case gdb.base/bg-exec-sigint-bp-cond.exp, I run into: ... ==================^M WARNING: ThreadSanitizer: signal handler spoils errno (pid=25422)^M #0 handler_wrapper gdb/posix-hdep.c:66^M #1 decltype ({parm#2}({parm#3}...)) gdb::handle_eintr<>() \ gdbsupport/eintr.h:67^M #2 gdb::waitpid(int, int*, int) gdbsupport/eintr.h:78^M #3 run_under_shell gdb/cli/cli-cmds.c:926^M ... Likewise in: - tui_sigwinch_handler with test-case gdb.python/tui-window.exp, and - handle_sighup with test-case gdb.base/quit-live.exp. Fix this by saving the original errno, and restoring it before returning [1]. Tested on x86_64-linux. Approved-By: Tom Tromey <tom@tromey.com> [1] https://www.gnu.org/software/libc/manual/html_node/POSIX-Safety-Concepts.html
-rw-r--r--gdb/event-top.c1
-rw-r--r--gdb/posix-hdep.c1
-rw-r--r--gdb/tui/tui-win.c1
3 files changed, 3 insertions, 0 deletions
diff --git a/gdb/event-top.c b/gdb/event-top.c
index 45ad7b9..102304c 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -1480,6 +1480,7 @@ async_do_nothing (gdb_client_data arg)
static void
handle_sighup (int sig)
{
+ scoped_restore restore_errno = make_scoped_restore (&errno);
mark_async_signal_handler (sighup_token);
signal (sig, handle_sighup);
}
diff --git a/gdb/posix-hdep.c b/gdb/posix-hdep.c
index a0d5c58..d7d17e6 100644
--- a/gdb/posix-hdep.c
+++ b/gdb/posix-hdep.c
@@ -64,6 +64,7 @@ static c_c_handler_ftype *current_handler;
static void
handler_wrapper (int num)
{
+ scoped_restore restore_errno = make_scoped_restore (&errno);
signal (num, handler_wrapper);
if (current_handler != SIG_IGN)
current_handler (num);
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index e9a8e46..414d469 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -527,6 +527,7 @@ static struct async_signal_handler *tui_sigwinch_token;
static void
tui_sigwinch_handler (int signal)
{
+ scoped_restore restore_errno = make_scoped_restore (&errno);
mark_async_signal_handler (tui_sigwinch_token);
tui_set_win_resized_to (true);
}