summaryrefslogtreecommitdiff
path: root/gdb/gdbserver/server.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2016-08-04 17:40:26 +0100
committerPedro Alves <palves@redhat.com>2016-08-04 17:40:26 +0100
commit4265c12fbbf4e7b181e3136ecbe1644121242abc (patch)
tree2070e80b92c6a683ad45f22d2647c0ceb9569155 /gdb/gdbserver/server.c
parent6f67973b4280cfd045e632a3340becd16e43b4b1 (diff)
downloadbinutils-gdb-4265c12fbbf4e7b181e3136ecbe1644121242abc.tar.gz
Fix PR gdb/18653: gdb disturbs inferior's inherited signal dispositionsusers/palves/restore-signal-dispositions
Today I was helping Phil debug something on the new C++ compile support, and we noticed that when debugging gdb under gdb, the inferior gdb behaved differently compared to when it was not being debugged. Turned out to be a manifestation of PR gdb/18653. Since the exec family of functions do not reset the signal disposition of signals that are set to SIG_IGN: http://pubs.opengroup.org/onlinepubs/7908799/xsh/execve.html Signals set to the default action (SIG_DFL) in the calling process image are set to the default action in the new process image. Signals set to be ignored (SIG_IGN) by the calling process image are set to be ignored by the new process image. Signals set to be caught by the calling process image are set to the default action in the new process image (see <signal.h>). gdb's (or gdbserver's) own signal handling should not interfere with the signal dispositions their spawned children inherit. However, it currently does. For example, some paths in gdb cause SIGPIPE to be set to SIG_IGN, and as consequence, the child starts with SIGPIPE to set to SIG_IGN too, even though gdb was started with SIGPIPE set to SIG_DFL. In order to be transparent, when spawning new child processes to debug (with "run", etc.), reset all signal dispositions back to what was originally inherited from gdb/gdbserver's parent, just before execing the target program to debug. gdb/ChangeLog: yyyy-mm-dd Pedro Alves <palves@redhat.com> PR gdb/18653 * Makefile.in (SFILES): Add common/signal-dispositions-save-restore.c. (HFILES_NO_SRCDIR): Add common/signal-dispositions-save-restore.h. (COMMON_OBS): Add signal-dispositions-save-restore.o. (signal-dispositions-save-restore.o): New rule. * configure: Regenerate. * fork-child.c: Include "signal-dispositions-save-restore.h". (fork_inferior): Call restore_original_signal_dispositions. * main.c: Include "signal-dispositions-save-restore.h". (captured_main): Call save_original_signal_dispositions. * common/common.m4: Add sigaction to AC_CHECK_FUNCS checks. * common/signal-dispositions-save-restore.c: New file. * common/signal-dispositions-save-restore.h: New file. gdb/gdbserver/ChangeLog: yyyy-mm-dd Pedro Alves <palves@redhat.com> PR gdb/18653 * Makefile.in (OBS): Add signal-dispositions-save-restore.o. (signal-dispositions-save-restore.o): New rule. * config.in: Regenerate. * configure: Regenerate. * linux-low.c: Include "signal-dispositions-save-restore.h". (linux_create_inferior): Call restore_original_signal_dispositions. * server.c: Include "signal-dispositions-save-restore.h". (captured_main): Call save_original_signal_dispositions. gdb/testsuite/ChangeLog: yyyy-mm-dd Pedro Alves <palves@redhat.com> PR gdb/18653 * gdb.base/signal-dispositions-child.c: New file. * gdb.base/signal-dispositions-child.exp: New file. * gdb.gdb/selftest.exp (do_steps_and_nexts): Add new pattern.
Diffstat (limited to 'gdb/gdbserver/server.c')
-rw-r--r--gdb/gdbserver/server.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 6d6cb0923e8..d5209472823 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -22,7 +22,7 @@
#include "notif.h"
#include "tdesc.h"
#include "rsp-low.h"
-
+#include "signal-dispositions-save-restore.h"
#include <ctype.h>
#include <unistd.h>
#if HAVE_SIGNAL_H
@@ -3611,6 +3611,8 @@ captured_main (int argc, char *argv[])
opened by remote_prepare. */
notice_open_fds ();
+ save_original_signal_dispositions ();
+
/* We need to know whether the remote connection is stdio before
starting the inferior. Inferiors created in this scenario have
stdin,stdout redirected. So do this here before we call