binutils-gdb/gdb/inflow.h
Alan Hayward 766f883622 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.
2019-05-28 10:07:54 +01:00

57 lines
1.4 KiB
C++

/* Low level interface to ptrace, for GDB when running under Unix.
Copyright (C) 2003-2019 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#ifndef INFLOW_H
#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 */