diff options
author | Alan Hayward <alan.hayward@arm.com> | 2019-05-28 10:07:54 +0100 |
---|---|---|
committer | Alan Hayward <alan.hayward@arm.com> | 2019-05-28 10:07:54 +0100 |
commit | 766f883622ef008230250aa5aecef9fb9b29f233 (patch) | |
tree | e1302190a7dc0b839e38d03dfbc192af18701dd6 /gdb/ser-unix.c | |
parent | 0f4a61b42002f568473f821f00dd240413beadd0 (diff) | |
download | gdb-766f883622ef008230250aa5aecef9fb9b29f233.zip gdb-766f883622ef008230250aa5aecef9fb9b29f233.tar.gz gdb-766f883622ef008230250aa5aecef9fb9b29f233.tar.bz2 |
Suppress SIGTTOU when handling errors
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.
Diffstat (limited to 'gdb/ser-unix.c')
-rw-r--r-- | gdb/ser-unix.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index 5a9965b..3492619 100644 --- a/gdb/ser-unix.c +++ b/gdb/ser-unix.c @@ -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); } |