]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Suppress SIGTTOU when handling errors
authorAlan Hayward <alan.hayward@arm.com>
Wed, 7 Aug 2019 16:23:49 +0000 (18:23 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 7 Aug 2019 16:23:49 +0000 (18:23 +0200)
[ Backport of commit 766f883622. ]

Calls to error () can cause SIGTTOU to send gdb to the background.

For example, on an Arm build:
  (gdb) b main
  Breakpoint 1 at 0x10774: file /build/gdb/testsuite/../../../src/binutils-gdb/gdb/testsuite/gdb.base/watchpoint.c, line 174.
  (gdb) r
  Starting program: /build/gdb/testsuite/outputs/gdb.base/watchpoint/watchpoint

  [1]+  Stopped                 ../gdb ./outputs/gdb.base/watchpoint/watchpoint
  localhost$ fg
  ../gdb ./outputs/gdb.base/watchpoint/watchpoint
  Cannot parse expression `.L1199 4@r4'.
  warning: Probes-based dynamic linker interface failed.
  Reverting to original interface.

The SIGTTOU is raised whilst inside a syscall during the call to tcdrain.
Fix is to use scoped_ignore_sigttou to ensure SIGTTOU is blocked.

In addition fix include comments - job_control is not included via terminal.h

gdb/ChangeLog:

* event-top.c: Remove include comment.
* inflow.c (class scoped_ignore_sigttou): Move from here...
* inflow.h (class scoped_ignore_sigttou): ...to here.
* ser-unix.c (hardwire_drain_output): Block SIGTTOU during drain.
* top.c:  Remove include comment.

gdb/ChangeLog
gdb/event-top.c
gdb/inflow.c
gdb/inflow.h
gdb/ser-unix.c
gdb/top.c

index f101a27be5358fd8aec00279478644c294c47251..c8ddcf6f2e62edcd7f18e68fddeb65e0e9821a83 100644 (file)
@@ -1,3 +1,11 @@
+2019-05-28  Alan Hayward  <alan.hayward@arm.com>
+
+       * event-top.c: Remove include comment.
+       * inflow.c (class scoped_ignore_sigttou): Move from here...
+       * inflow.h (class scoped_ignore_sigttou): ...to here.
+       * ser-unix.c (hardwire_drain_output): Block SIGTTOU during drain.
+       * top.c:  Remove include comment.
+
 2019-08-04  Alan Hayward  <alan.hayward@arm.com>
 
        * symfile.c (symbol_file_command): Call solib_create_inferior_hook.
index fb5d51c6e10b0148df9585f72f8d6aefba7b8c4d..e077e29ba058211041853d532311de59917fe2af 100644 (file)
@@ -24,7 +24,7 @@
 #include "inferior.h"
 #include "infrun.h"
 #include "target.h"
-#include "terminal.h"          /* for job_control */
+#include "terminal.h"
 #include "event-loop.h"
 #include "event-top.h"
 #include "interps.h"
index b71511308b3930ed1b89973c91897872c551096e..c1f26939929d9e0c6a1fdcaf0c572537a5a85b47 100644 (file)
@@ -103,35 +103,6 @@ static serial_ttystate initial_gdb_ttystate;
 
 static struct terminal_info *get_inflow_inferior_data (struct inferior *);
 
-/* RAII class used to ignore SIGTTOU in a scope.  */
-
-class scoped_ignore_sigttou
-{
-public:
-  scoped_ignore_sigttou ()
-  {
-#ifdef SIGTTOU
-    if (job_control)
-      m_osigttou = signal (SIGTTOU, SIG_IGN);
-#endif
-  }
-
-  ~scoped_ignore_sigttou ()
-  {
-#ifdef SIGTTOU
-    if (job_control)
-      signal (SIGTTOU, m_osigttou);
-#endif
-  }
-
-  DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou);
-
-private:
-#ifdef SIGTTOU
-  sighandler_t m_osigttou = NULL;
-#endif
-};
-
 /* While the inferior is running, we want SIGINT and SIGQUIT to go to the
    inferior only.  If we have job control, that takes care of it.  If not,
    we save our handlers in these two variables and set SIGINT and SIGQUIT
index c32aa1443310d2eb304f84e64c0f44b478941019..5dd5c37bd2b708bcaeaf2155ed46540df12b2dff 100644 (file)
 #define INFLOW_H
 
 #include <unistd.h>
+#include <signal.h>
+#include "common/job-control.h"
+
+/* RAII class used to ignore SIGTTOU in a scope.  */
+
+class scoped_ignore_sigttou
+{
+public:
+  scoped_ignore_sigttou ()
+  {
+#ifdef SIGTTOU
+    if (job_control)
+      m_osigttou = signal (SIGTTOU, SIG_IGN);
+#endif
+  }
+
+  ~scoped_ignore_sigttou ()
+  {
+#ifdef SIGTTOU
+    if (job_control)
+      signal (SIGTTOU, m_osigttou);
+#endif
+  }
+
+  DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou);
+
+private:
+#ifdef SIGTTOU
+  sighandler_t m_osigttou = NULL;
+#endif
+};
 
 #endif /* inflow.h */
index 5a9965bf744a0a67cd7c0a92a77c11b9f977d931..3492619f2d6e50d039b3432a1cb040e83a5fd03e 100644 (file)
@@ -32,6 +32,7 @@
 #include "gdbcmd.h"
 #include "common/filestuff.h"
 #include <termios.h>
+#include "inflow.h"
 
 struct hardwire_ttystate
   {
@@ -164,6 +165,9 @@ hardwire_print_tty_state (struct serial *scb,
 static int
 hardwire_drain_output (struct serial *scb)
 {
+  /* Ignore SIGTTOU which may occur during the drain.  */
+  scoped_ignore_sigttou ignore_sigttou;
+
   return tcdrain (scb->fd);
 }
 
index acc67202b6451695a13b99f037fdb4916238264e..00e0791a2dd56b358357df58cddda50ea49c7311 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -34,7 +34,7 @@
 #include "expression.h"
 #include "value.h"
 #include "language.h"
-#include "terminal.h"          /* For job_control.  */
+#include "terminal.h"
 #include "common/job-control.h"
 #include "annotate.h"
 #include "completer.h"