License cleanup: add SPDX GPL-2.0 license identifier to files with no license
Many source files in the tree are missing licensing information, which
makes it harder for compliance tools to determine the correct license.
By default all files without license information are under the default
license of the kernel, which is GPL version 2.
Update the files which contain no license information with the 'GPL-2.0'
SPDX license identifier. The SPDX identifier is a legally binding
shorthand, which can be used instead of the full boiler plate text.
This patch is based on work done by Thomas Gleixner and Kate Stewart and
Philippe Ombredanne.
How this work was done:
Patches were generated and checked against linux-4.14-rc6 for a subset of
the use cases:
- file had no licensing information it it.
- file was a */uapi/* one with no licensing information in it,
- file was a */uapi/* one with existing licensing information,
Further patches will be generated in subsequent months to fix up cases
where non-standard license headers were used, and references to license
had to be inferred by heuristics based on keywords.
The analysis to determine which SPDX License Identifier to be applied to
a file was done in a spreadsheet of side by side results from of the
output of two independent scanners (ScanCode & Windriver) producing SPDX
tag:value files created by Philippe Ombredanne. Philippe prepared the
base worksheet, and did an initial spot review of a few 1000 files.
The 4.13 kernel was the starting point of the analysis with 60,537 files
assessed. Kate Stewart did a file by file comparison of the scanner
results in the spreadsheet to determine which SPDX license identifier(s)
to be applied to the file. She confirmed any determination that was not
immediately clear with lawyers working with the Linux Foundation.
Criteria used to select files for SPDX license identifier tagging was:
- Files considered eligible had to be source code files.
- Make and config files were included as candidates if they contained >5
lines of source
- File already had some variant of a license header in it (even if <5
lines).
All documentation files were explicitly excluded.
The following heuristics were used to determine which SPDX license
identifiers to apply.
- when both scanners couldn't find any license traces, file was
considered to have no license information in it, and the top level
COPYING file license applied.
For non */uapi/* files that summary was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 11139
and resulted in the first patch in this series.
If that file was a */uapi/* path one, it was "GPL-2.0 WITH
Linux-syscall-note" otherwise it was "GPL-2.0". Results of that was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 WITH Linux-syscall-note 930
and resulted in the second patch in this series.
- if a file had some form of licensing information in it, and was one
of the */uapi/* ones, it was denoted with the Linux-syscall-note if
any GPL family license was found in the file or had no licensing in
it (per prior point). Results summary:
SPDX license identifier # files
---------------------------------------------------|------
GPL-2.0 WITH Linux-syscall-note 270
GPL-2.0+ WITH Linux-syscall-note 169
((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) 21
((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) 17
LGPL-2.1+ WITH Linux-syscall-note 15
GPL-1.0+ WITH Linux-syscall-note 14
((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) 5
LGPL-2.0+ WITH Linux-syscall-note 4
LGPL-2.1 WITH Linux-syscall-note 3
((GPL-2.0 WITH Linux-syscall-note) OR MIT) 3
((GPL-2.0 WITH Linux-syscall-note) AND MIT) 1
and that resulted in the third patch in this series.
- when the two scanners agreed on the detected license(s), that became
the concluded license(s).
- when there was disagreement between the two scanners (one detected a
license but the other didn't, or they both detected different
licenses) a manual inspection of the file occurred.
- In most cases a manual inspection of the information in the file
resulted in a clear resolution of the license that should apply (and
which scanner probably needed to revisit its heuristics).
- When it was not immediately clear, the license identifier was
confirmed with lawyers working with the Linux Foundation.
- If there was any question as to the appropriate license identifier,
the file was flagged for further research and to be revisited later
in time.
In total, over 70 hours of logged manual review was done on the
spreadsheet to determine the SPDX license identifiers to apply to the
source files by Kate, Philippe, Thomas and, in some cases, confirmation
by lawyers working with the Linux Foundation.
Kate also obtained a third independent scan of the 4.13 code base from
FOSSology, and compared selected files where the other two scanners
disagreed against that SPDX file, to see if there was new insights. The
Windriver scanner is based on an older version of FOSSology in part, so
they are related.
Thomas did random spot checks in about 500 files from the spreadsheets
for the uapi headers and agreed with SPDX license identifier in the
files he inspected. For the non-uapi files Thomas did random spot checks
in about 15000 files.
In initial set of patches against 4.14-rc6, 3 files were found to have
copy/paste license identifier errors, and have been fixed to reflect the
correct identifier.
Additionally Philippe spent 10 hours this week doing a detailed manual
inspection and review of the 12,461 patched files from the initial patch
version early this week with:
- a full scancode scan run, collecting the matched texts, detected
license ids and scores
- reviewing anything where there was a license detected (about 500+
files) to ensure that the applied SPDX license was correct
- reviewing anything where there was no detection but the patch license
was not GPL-2.0 WITH Linux-syscall-note to ensure that the applied
SPDX license was correct
This produced a worksheet with 20 files needing minor correction. This
worksheet was then exported into 3 different .csv files for the
different types of files to be modified.
These .csv files were then reviewed by Greg. Thomas wrote a script to
parse the csv files and add the proper SPDX tag to the file, in the
format that the file expected. This script was further refined by Greg
based on the output to detect more types of files automatically and to
distinguish between header and source .c files (which need different
comment types.) Finally Greg ran the script using the .csv files to
generate the patches.
Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org>
Reviewed-by: Philippe Ombredanne <pombredanne@nexb.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-11-01 22:07:57 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
2005-04-17 06:20:36 +08:00
|
|
|
#ifndef _LINUX_TTY_H
|
|
|
|
#define _LINUX_TTY_H
|
|
|
|
|
2011-05-24 16:43:03 +08:00
|
|
|
#include <linux/fs.h>
|
|
|
|
#include <linux/major.h>
|
|
|
|
#include <linux/termios.h>
|
|
|
|
#include <linux/workqueue.h>
|
2021-07-23 18:31:45 +08:00
|
|
|
#include <linux/tty_buffer.h>
|
2011-05-24 16:43:03 +08:00
|
|
|
#include <linux/tty_driver.h>
|
|
|
|
#include <linux/tty_ldisc.h>
|
2021-07-23 18:31:46 +08:00
|
|
|
#include <linux/tty_port.h>
|
2011-05-24 16:43:03 +08:00
|
|
|
#include <linux/mutex.h>
|
2012-09-04 23:35:08 +08:00
|
|
|
#include <linux/tty_flags.h>
|
2012-10-13 17:46:48 +08:00
|
|
|
#include <uapi/linux/tty.h>
|
2013-06-15 21:14:23 +08:00
|
|
|
#include <linux/rwsem.h>
|
2013-06-15 21:36:06 +08:00
|
|
|
#include <linux/llist.h>
|
2011-05-24 16:43:03 +08:00
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* (Note: the *_driver.minor_start values 1, 64, 128, 192 are
|
|
|
|
* hardcoded at present.)
|
|
|
|
*/
|
|
|
|
#define NR_UNIX98_PTY_DEFAULT 4096 /* Default maximum for Unix98 ptys */
|
2012-01-05 17:06:11 +08:00
|
|
|
#define NR_UNIX98_PTY_RESERVE 1024 /* Default reserve for main devpts */
|
2011-05-24 16:43:03 +08:00
|
|
|
#define NR_UNIX98_PTY_MAX (1 << MINORBITS) /* Absolute limit */
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* This character is the same as _POSIX_VDISABLE: it cannot be used as
|
|
|
|
* a c_cc[] character, but indicates that a particular special character
|
|
|
|
* isn't in use (eg VINTR has no character etc)
|
|
|
|
*/
|
|
|
|
#define __DISABLED_CHAR '\0'
|
|
|
|
|
2012-07-14 22:31:47 +08:00
|
|
|
#define INTR_CHAR(tty) ((tty)->termios.c_cc[VINTR])
|
|
|
|
#define QUIT_CHAR(tty) ((tty)->termios.c_cc[VQUIT])
|
|
|
|
#define ERASE_CHAR(tty) ((tty)->termios.c_cc[VERASE])
|
|
|
|
#define KILL_CHAR(tty) ((tty)->termios.c_cc[VKILL])
|
|
|
|
#define EOF_CHAR(tty) ((tty)->termios.c_cc[VEOF])
|
|
|
|
#define TIME_CHAR(tty) ((tty)->termios.c_cc[VTIME])
|
|
|
|
#define MIN_CHAR(tty) ((tty)->termios.c_cc[VMIN])
|
|
|
|
#define SWTC_CHAR(tty) ((tty)->termios.c_cc[VSWTC])
|
|
|
|
#define START_CHAR(tty) ((tty)->termios.c_cc[VSTART])
|
|
|
|
#define STOP_CHAR(tty) ((tty)->termios.c_cc[VSTOP])
|
|
|
|
#define SUSP_CHAR(tty) ((tty)->termios.c_cc[VSUSP])
|
|
|
|
#define EOL_CHAR(tty) ((tty)->termios.c_cc[VEOL])
|
|
|
|
#define REPRINT_CHAR(tty) ((tty)->termios.c_cc[VREPRINT])
|
|
|
|
#define DISCARD_CHAR(tty) ((tty)->termios.c_cc[VDISCARD])
|
|
|
|
#define WERASE_CHAR(tty) ((tty)->termios.c_cc[VWERASE])
|
|
|
|
#define LNEXT_CHAR(tty) ((tty)->termios.c_cc[VLNEXT])
|
|
|
|
#define EOL2_CHAR(tty) ((tty)->termios.c_cc[VEOL2])
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2012-07-14 22:31:47 +08:00
|
|
|
#define _I_FLAG(tty, f) ((tty)->termios.c_iflag & (f))
|
|
|
|
#define _O_FLAG(tty, f) ((tty)->termios.c_oflag & (f))
|
|
|
|
#define _C_FLAG(tty, f) ((tty)->termios.c_cflag & (f))
|
|
|
|
#define _L_FLAG(tty, f) ((tty)->termios.c_lflag & (f))
|
2008-07-17 04:54:54 +08:00
|
|
|
|
|
|
|
#define I_IGNBRK(tty) _I_FLAG((tty), IGNBRK)
|
|
|
|
#define I_BRKINT(tty) _I_FLAG((tty), BRKINT)
|
|
|
|
#define I_IGNPAR(tty) _I_FLAG((tty), IGNPAR)
|
|
|
|
#define I_PARMRK(tty) _I_FLAG((tty), PARMRK)
|
|
|
|
#define I_INPCK(tty) _I_FLAG((tty), INPCK)
|
|
|
|
#define I_ISTRIP(tty) _I_FLAG((tty), ISTRIP)
|
|
|
|
#define I_INLCR(tty) _I_FLAG((tty), INLCR)
|
|
|
|
#define I_IGNCR(tty) _I_FLAG((tty), IGNCR)
|
|
|
|
#define I_ICRNL(tty) _I_FLAG((tty), ICRNL)
|
|
|
|
#define I_IUCLC(tty) _I_FLAG((tty), IUCLC)
|
|
|
|
#define I_IXON(tty) _I_FLAG((tty), IXON)
|
|
|
|
#define I_IXANY(tty) _I_FLAG((tty), IXANY)
|
|
|
|
#define I_IXOFF(tty) _I_FLAG((tty), IXOFF)
|
|
|
|
#define I_IMAXBEL(tty) _I_FLAG((tty), IMAXBEL)
|
|
|
|
#define I_IUTF8(tty) _I_FLAG((tty), IUTF8)
|
|
|
|
|
|
|
|
#define O_OPOST(tty) _O_FLAG((tty), OPOST)
|
|
|
|
#define O_OLCUC(tty) _O_FLAG((tty), OLCUC)
|
|
|
|
#define O_ONLCR(tty) _O_FLAG((tty), ONLCR)
|
|
|
|
#define O_OCRNL(tty) _O_FLAG((tty), OCRNL)
|
|
|
|
#define O_ONOCR(tty) _O_FLAG((tty), ONOCR)
|
|
|
|
#define O_ONLRET(tty) _O_FLAG((tty), ONLRET)
|
|
|
|
#define O_OFILL(tty) _O_FLAG((tty), OFILL)
|
|
|
|
#define O_OFDEL(tty) _O_FLAG((tty), OFDEL)
|
|
|
|
#define O_NLDLY(tty) _O_FLAG((tty), NLDLY)
|
|
|
|
#define O_CRDLY(tty) _O_FLAG((tty), CRDLY)
|
|
|
|
#define O_TABDLY(tty) _O_FLAG((tty), TABDLY)
|
|
|
|
#define O_BSDLY(tty) _O_FLAG((tty), BSDLY)
|
|
|
|
#define O_VTDLY(tty) _O_FLAG((tty), VTDLY)
|
|
|
|
#define O_FFDLY(tty) _O_FLAG((tty), FFDLY)
|
|
|
|
|
|
|
|
#define C_BAUD(tty) _C_FLAG((tty), CBAUD)
|
|
|
|
#define C_CSIZE(tty) _C_FLAG((tty), CSIZE)
|
|
|
|
#define C_CSTOPB(tty) _C_FLAG((tty), CSTOPB)
|
|
|
|
#define C_CREAD(tty) _C_FLAG((tty), CREAD)
|
|
|
|
#define C_PARENB(tty) _C_FLAG((tty), PARENB)
|
|
|
|
#define C_PARODD(tty) _C_FLAG((tty), PARODD)
|
|
|
|
#define C_HUPCL(tty) _C_FLAG((tty), HUPCL)
|
|
|
|
#define C_CLOCAL(tty) _C_FLAG((tty), CLOCAL)
|
|
|
|
#define C_CIBAUD(tty) _C_FLAG((tty), CIBAUD)
|
|
|
|
#define C_CRTSCTS(tty) _C_FLAG((tty), CRTSCTS)
|
2013-12-30 02:23:16 +08:00
|
|
|
#define C_CMSPAR(tty) _C_FLAG((tty), CMSPAR)
|
2008-07-17 04:54:54 +08:00
|
|
|
|
|
|
|
#define L_ISIG(tty) _L_FLAG((tty), ISIG)
|
|
|
|
#define L_ICANON(tty) _L_FLAG((tty), ICANON)
|
|
|
|
#define L_XCASE(tty) _L_FLAG((tty), XCASE)
|
|
|
|
#define L_ECHO(tty) _L_FLAG((tty), ECHO)
|
|
|
|
#define L_ECHOE(tty) _L_FLAG((tty), ECHOE)
|
|
|
|
#define L_ECHOK(tty) _L_FLAG((tty), ECHOK)
|
|
|
|
#define L_ECHONL(tty) _L_FLAG((tty), ECHONL)
|
|
|
|
#define L_NOFLSH(tty) _L_FLAG((tty), NOFLSH)
|
|
|
|
#define L_TOSTOP(tty) _L_FLAG((tty), TOSTOP)
|
|
|
|
#define L_ECHOCTL(tty) _L_FLAG((tty), ECHOCTL)
|
|
|
|
#define L_ECHOPRT(tty) _L_FLAG((tty), ECHOPRT)
|
|
|
|
#define L_ECHOKE(tty) _L_FLAG((tty), ECHOKE)
|
|
|
|
#define L_FLUSHO(tty) _L_FLAG((tty), FLUSHO)
|
|
|
|
#define L_PENDIN(tty) _L_FLAG((tty), PENDIN)
|
|
|
|
#define L_IEXTEN(tty) _L_FLAG((tty), IEXTEN)
|
tty: Add EXTPROC support for LINEMODE
This patch is against the 2.6.34 source.
Paraphrased from the 1989 BSD patch by David Borman @ cray.com:
These are the changes needed for the kernel to support
LINEMODE in the server.
There is a new bit in the termios local flag word, EXTPROC.
When this bit is set, several aspects of the terminal driver
are disabled. Input line editing, character echo, and mapping
of signals are all disabled. This allows the telnetd to turn
off these functions when in linemode, but still keep track of
what state the user wants the terminal to be in.
New ioctl:
TIOCSIG Generate a signal to processes in the
current process group of the pty.
There is a new mode for packet driver, the TIOCPKT_IOCTL bit.
When packet mode is turned on in the pty, and the EXTPROC bit
is set, then whenever the state of the pty is changed, the
next read on the master side of the pty will have the TIOCPKT_IOCTL
bit set. This allows the process on the server side of the pty
to know when the state of the terminal has changed; it can then
issue the appropriate ioctl to retrieve the new state.
Since the original BSD patches accompanied the source code for telnet
I've left that reference here, but obviously the feature is useful for
any remote terminal protocol, including ssh.
The corresponding feature has existed in the BSD tty driver since 1989.
For historical reference, a good copy of the relevant files can be found
here:
http://anonsvn.mit.edu/viewvc/krb5/trunk/src/appl/telnet/?pathrev=17741
Signed-off-by: Howard Chu <hyc@symas.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2010-06-23 01:14:49 +08:00
|
|
|
#define L_EXTPROC(tty) _L_FLAG((tty), EXTPROC)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
struct device;
|
Audit: add TTY input auditing
Add TTY input auditing, used to audit system administrator's actions. This is
required by various security standards such as DCID 6/3 and PCI to provide
non-repudiation of administrator's actions and to allow a review of past
actions if the administrator seems to overstep their duties or if the system
becomes misconfigured for unknown reasons. These requirements do not make it
necessary to audit TTY output as well.
Compared to an user-space keylogger, this approach records TTY input using the
audit subsystem, correlated with other audit events, and it is completely
transparent to the user-space application (e.g. the console ioctls still
work).
TTY input auditing works on a higher level than auditing all system calls
within the session, which would produce an overwhelming amount of mostly
useless audit events.
Add an "audit_tty" attribute, inherited across fork (). Data read from TTYs
by process with the attribute is sent to the audit subsystem by the kernel.
The audit netlink interface is extended to allow modifying the audit_tty
attribute, and to allow sending explanatory audit events from user-space (for
example, a shell might send an event containing the final command, after the
interactive command-line editing and history expansion is performed, which
might be difficult to decipher from the TTY input alone).
Because the "audit_tty" attribute is inherited across fork (), it would be set
e.g. for sshd restarted within an audited session. To prevent this, the
audit_tty attribute is cleared when a process with no open TTY file
descriptors (e.g. after daemon startup) opens a TTY.
See https://www.redhat.com/archives/linux-audit/2007-June/msg00000.html for a
more detailed rationale document for an older version of this patch.
[akpm@linux-foundation.org: build fix]
Signed-off-by: Miloslav Trmac <mitr@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Paul Fulghum <paulkf@microgate.com>
Cc: Casey Schaufler <casey@schaufler-ca.com>
Cc: Steve Grubb <sgrubb@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-16 14:40:56 +08:00
|
|
|
struct signal_struct;
|
2008-04-30 15:54:13 +08:00
|
|
|
struct tty_operations;
|
|
|
|
|
2021-05-05 17:19:05 +08:00
|
|
|
/**
|
|
|
|
* struct tty_struct - state associated with a tty while open
|
|
|
|
*
|
2021-11-26 16:15:49 +08:00
|
|
|
* @kref: reference counting by tty_kref_get() and tty_kref_put(), reaching zero
|
|
|
|
* frees the structure
|
|
|
|
* @dev: class device or %NULL (e.g. ptys, serdev)
|
|
|
|
* @driver: &struct tty_driver operating this tty
|
|
|
|
* @ops: &struct tty_operations of @driver for this tty (open, close, etc.)
|
|
|
|
* @index: index of this tty (e.g. to construct @name like tty12)
|
|
|
|
* @ldisc_sem: protects line discipline changes (@ldisc) -- lock tty not pty
|
|
|
|
* @ldisc: the current line discipline for this tty (n_tty by default)
|
|
|
|
* @atomic_write_lock: protects against concurrent writers, i.e. locks
|
|
|
|
* @write_cnt, @write_buf and similar
|
|
|
|
* @legacy_mutex: leftover from history (BKL -> BTM -> @legacy_mutex),
|
|
|
|
* protecting several operations on this tty
|
|
|
|
* @throttle_mutex: protects against concurrent tty_throttle_safe() and
|
|
|
|
* tty_unthrottle_safe() (but not tty_unthrottle())
|
|
|
|
* @termios_rwsem: protects @termios and @termios_locked
|
|
|
|
* @winsize_mutex: protects @winsize
|
|
|
|
* @termios: termios for the current tty, copied from/to @driver.termios
|
|
|
|
* @termios_locked: locked termios (by %TIOCGLCKTRMIOS and %TIOCSLCKTRMIOS
|
|
|
|
* ioctls)
|
|
|
|
* @name: name of the tty constructed by tty_line_name() (e.g. ttyS3)
|
|
|
|
* @flags: bitwise OR of %TTY_THROTTLED, %TTY_IO_ERROR, ...
|
|
|
|
* @count: count of open processes, reaching zero cancels all the work for
|
|
|
|
* this tty and drops a @kref too (but does not free this tty)
|
|
|
|
* @winsize: size of the terminal "window" (cf. @winsize_mutex)
|
|
|
|
* @flow: flow settings grouped together, see also @flow.unused
|
|
|
|
* @flow.lock: lock for @flow members
|
|
|
|
* @flow.stopped: tty stopped/started by stop_tty()/start_tty()
|
|
|
|
* @flow.tco_stopped: tty stopped/started by %TCOOFF/%TCOON ioctls (it has
|
|
|
|
* precedence over @flow.stopped)
|
2021-05-05 17:19:05 +08:00
|
|
|
* @flow.unused: alignment for Alpha, so that no members other than @flow.* are
|
|
|
|
* modified by the same 64b word store. The @flow's __aligned is
|
|
|
|
* there for the very same reason.
|
2021-11-26 16:15:49 +08:00
|
|
|
* @ctrl: control settings grouped together, see also @ctrl.unused
|
|
|
|
* @ctrl.lock: lock for @ctrl members
|
2021-05-05 17:19:06 +08:00
|
|
|
* @ctrl.pgrp: process group of this tty (setpgrp(2))
|
|
|
|
* @ctrl.session: session of this tty (setsid(2)). Writes are protected by both
|
2021-11-26 16:15:49 +08:00
|
|
|
* @ctrl.lock and @legacy_mutex, readers must use at least one of
|
2021-05-05 17:19:06 +08:00
|
|
|
* them.
|
2021-11-26 16:15:49 +08:00
|
|
|
* @ctrl.pktstatus: packet mode status (bitwise OR of %TIOCPKT_ constants)
|
2021-05-05 17:19:06 +08:00
|
|
|
* @ctrl.packet: packet mode enabled
|
2021-11-26 16:15:49 +08:00
|
|
|
* @ctrl.unused: alignment for Alpha, see @flow.unused for explanation
|
|
|
|
* @hw_stopped: not controlled by the tty layer, under @driver's control for CTS
|
|
|
|
* handling
|
|
|
|
* @receive_room: bytes permitted to feed to @ldisc without any being lost
|
|
|
|
* @flow_change: controls behavior of throttling, see tty_throttle_safe() and
|
|
|
|
* tty_unthrottle_safe()
|
|
|
|
* @link: link to another pty (master -> slave and vice versa)
|
|
|
|
* @fasync: state for %O_ASYNC (for %SIGIO); managed by fasync_helper()
|
|
|
|
* @write_wait: concurrent writers are waiting in this queue until they are
|
|
|
|
* allowed to write
|
|
|
|
* @read_wait: readers wait for data in this queue
|
|
|
|
* @hangup_work: normally a work to perform a hangup (do_tty_hangup()); while
|
|
|
|
* freeing the tty, (re)used to release_one_tty()
|
|
|
|
* @disc_data: pointer to @ldisc's private data (e.g. to &struct n_tty_data)
|
|
|
|
* @driver_data: pointer to @driver's private data (e.g. &struct uart_state)
|
|
|
|
* @files_lock: protects @tty_files list
|
|
|
|
* @tty_files: list of (re)openers of this tty (i.e. linked &struct
|
|
|
|
* tty_file_private)
|
|
|
|
* @closing: when set during close, n_tty processes only START & STOP chars
|
|
|
|
* @write_buf: temporary buffer used during tty_write() to copy user data to
|
|
|
|
* @write_cnt: count of bytes written in tty_write() to @write_buf
|
|
|
|
* @SAK_work: if the tty has a pending do_SAK, it is queued here
|
|
|
|
* @port: persistent storage for this device (i.e. &struct tty_port)
|
2021-05-05 17:19:05 +08:00
|
|
|
*
|
|
|
|
* All of the state associated with a tty while the tty is open. Persistent
|
2021-11-26 16:15:49 +08:00
|
|
|
* storage for tty devices is referenced here as @port and is documented in
|
|
|
|
* &struct tty_port.
|
2021-05-05 17:19:05 +08:00
|
|
|
*/
|
2005-04-17 06:20:36 +08:00
|
|
|
struct tty_struct {
|
2008-10-13 17:37:26 +08:00
|
|
|
struct kref kref;
|
2021-11-26 16:15:49 +08:00
|
|
|
struct device *dev;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct tty_driver *driver;
|
2008-04-30 15:54:13 +08:00
|
|
|
const struct tty_operations *ops;
|
2005-04-17 06:20:36 +08:00
|
|
|
int index;
|
2009-06-11 19:50:12 +08:00
|
|
|
|
2013-06-15 19:04:48 +08:00
|
|
|
struct ld_semaphore ldisc_sem;
|
2009-06-11 19:50:12 +08:00
|
|
|
struct tty_ldisc *ldisc;
|
|
|
|
|
2012-10-19 04:26:42 +08:00
|
|
|
struct mutex atomic_write_lock;
|
2012-08-08 23:30:13 +08:00
|
|
|
struct mutex legacy_mutex;
|
2013-06-15 21:14:31 +08:00
|
|
|
struct mutex throttle_mutex;
|
2013-06-15 21:14:23 +08:00
|
|
|
struct rw_semaphore termios_rwsem;
|
tty: Fix lock order in tty_do_resize()
Commits 6a1c0680cf3ba94356ecd58833e1540c93472a57 and
9356b535fcb71db494fc434acceb79f56d15bda2, respectively
'tty: Convert termios_mutex to termios_rwsem' and
'n_tty: Access termios values safely'
introduced a circular lock dependency with console_lock and
termios_rwsem.
The lockdep report [1] shows that n_tty_write() will attempt
to claim console_lock while holding the termios_rwsem, whereas
tty_do_resize() may already hold the console_lock while
claiming the termios_rwsem.
Since n_tty_write() and tty_do_resize() do not contend
over the same data -- the tty->winsize structure -- correct
the lock dependency by introducing a new lock which
specifically serializes access to tty->winsize only.
[1] Lockdep report
======================================================
[ INFO: possible circular locking dependency detected ]
3.10.0-0+tip-xeon+lockdep #0+tip Not tainted
-------------------------------------------------------
modprobe/277 is trying to acquire lock:
(&tty->termios_rwsem){++++..}, at: [<ffffffff81452656>] tty_do_resize+0x36/0xe0
but task is already holding lock:
((fb_notifier_list).rwsem){.+.+.+}, at: [<ffffffff8107aac6>] __blocking_notifier_call_chain+0x56/0xc0
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 ((fb_notifier_list).rwsem){.+.+.+}:
[<ffffffff810b6d62>] lock_acquire+0x92/0x1f0
[<ffffffff8175b797>] down_read+0x47/0x5c
[<ffffffff8107aac6>] __blocking_notifier_call_chain+0x56/0xc0
[<ffffffff8107ab46>] blocking_notifier_call_chain+0x16/0x20
[<ffffffff813d7c0b>] fb_notifier_call_chain+0x1b/0x20
[<ffffffff813d95b2>] register_framebuffer+0x1e2/0x320
[<ffffffffa01043e1>] drm_fb_helper_initial_config+0x371/0x540 [drm_kms_helper]
[<ffffffffa01bcb05>] nouveau_fbcon_init+0x105/0x140 [nouveau]
[<ffffffffa01ad0af>] nouveau_drm_load+0x43f/0x610 [nouveau]
[<ffffffffa008a79e>] drm_get_pci_dev+0x17e/0x2a0 [drm]
[<ffffffffa01ad4da>] nouveau_drm_probe+0x25a/0x2a0 [nouveau]
[<ffffffff813b13db>] local_pci_probe+0x4b/0x80
[<ffffffff813b1701>] pci_device_probe+0x111/0x120
[<ffffffff814977eb>] driver_probe_device+0x8b/0x3a0
[<ffffffff81497bab>] __driver_attach+0xab/0xb0
[<ffffffff814956ad>] bus_for_each_dev+0x5d/0xa0
[<ffffffff814971fe>] driver_attach+0x1e/0x20
[<ffffffff81496cc1>] bus_add_driver+0x111/0x290
[<ffffffff814982b7>] driver_register+0x77/0x170
[<ffffffff813b0454>] __pci_register_driver+0x64/0x70
[<ffffffffa008a9da>] drm_pci_init+0x11a/0x130 [drm]
[<ffffffffa022a04d>] nouveau_drm_init+0x4d/0x1000 [nouveau]
[<ffffffff810002ea>] do_one_initcall+0xea/0x1a0
[<ffffffff810c54cb>] load_module+0x123b/0x1bf0
[<ffffffff810c5f57>] SyS_init_module+0xd7/0x120
[<ffffffff817677c2>] system_call_fastpath+0x16/0x1b
-> #1 (console_lock){+.+.+.}:
[<ffffffff810b6d62>] lock_acquire+0x92/0x1f0
[<ffffffff810430a7>] console_lock+0x77/0x80
[<ffffffff8146b2a1>] con_flush_chars+0x31/0x50
[<ffffffff8145780c>] n_tty_write+0x1ec/0x4d0
[<ffffffff814541b9>] tty_write+0x159/0x2e0
[<ffffffff814543f5>] redirected_tty_write+0xb5/0xc0
[<ffffffff811ab9d5>] vfs_write+0xc5/0x1f0
[<ffffffff811abec5>] SyS_write+0x55/0xa0
[<ffffffff817677c2>] system_call_fastpath+0x16/0x1b
-> #0 (&tty->termios_rwsem){++++..}:
[<ffffffff810b65c3>] __lock_acquire+0x1c43/0x1d30
[<ffffffff810b6d62>] lock_acquire+0x92/0x1f0
[<ffffffff8175b724>] down_write+0x44/0x70
[<ffffffff81452656>] tty_do_resize+0x36/0xe0
[<ffffffff8146c841>] vc_do_resize+0x3e1/0x4c0
[<ffffffff8146c99f>] vc_resize+0x1f/0x30
[<ffffffff813e4535>] fbcon_init+0x385/0x5a0
[<ffffffff8146a4bc>] visual_init+0xbc/0x120
[<ffffffff8146cd13>] do_bind_con_driver+0x163/0x320
[<ffffffff8146cfa1>] do_take_over_console+0x61/0x70
[<ffffffff813e2b93>] do_fbcon_takeover+0x63/0xc0
[<ffffffff813e67a5>] fbcon_event_notify+0x715/0x820
[<ffffffff81762f9d>] notifier_call_chain+0x5d/0x110
[<ffffffff8107aadc>] __blocking_notifier_call_chain+0x6c/0xc0
[<ffffffff8107ab46>] blocking_notifier_call_chain+0x16/0x20
[<ffffffff813d7c0b>] fb_notifier_call_chain+0x1b/0x20
[<ffffffff813d95b2>] register_framebuffer+0x1e2/0x320
[<ffffffffa01043e1>] drm_fb_helper_initial_config+0x371/0x540 [drm_kms_helper]
[<ffffffffa01bcb05>] nouveau_fbcon_init+0x105/0x140 [nouveau]
[<ffffffffa01ad0af>] nouveau_drm_load+0x43f/0x610 [nouveau]
[<ffffffffa008a79e>] drm_get_pci_dev+0x17e/0x2a0 [drm]
[<ffffffffa01ad4da>] nouveau_drm_probe+0x25a/0x2a0 [nouveau]
[<ffffffff813b13db>] local_pci_probe+0x4b/0x80
[<ffffffff813b1701>] pci_device_probe+0x111/0x120
[<ffffffff814977eb>] driver_probe_device+0x8b/0x3a0
[<ffffffff81497bab>] __driver_attach+0xab/0xb0
[<ffffffff814956ad>] bus_for_each_dev+0x5d/0xa0
[<ffffffff814971fe>] driver_attach+0x1e/0x20
[<ffffffff81496cc1>] bus_add_driver+0x111/0x290
[<ffffffff814982b7>] driver_register+0x77/0x170
[<ffffffff813b0454>] __pci_register_driver+0x64/0x70
[<ffffffffa008a9da>] drm_pci_init+0x11a/0x130 [drm]
[<ffffffffa022a04d>] nouveau_drm_init+0x4d/0x1000 [nouveau]
[<ffffffff810002ea>] do_one_initcall+0xea/0x1a0
[<ffffffff810c54cb>] load_module+0x123b/0x1bf0
[<ffffffff810c5f57>] SyS_init_module+0xd7/0x120
[<ffffffff817677c2>] system_call_fastpath+0x16/0x1b
other info that might help us debug this:
Chain exists of:
&tty->termios_rwsem --> console_lock --> (fb_notifier_list).rwsem
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock((fb_notifier_list).rwsem);
lock(console_lock);
lock((fb_notifier_list).rwsem);
lock(&tty->termios_rwsem);
*** DEADLOCK ***
7 locks held by modprobe/277:
#0: (&__lockdep_no_validate__){......}, at: [<ffffffff81497b5b>] __driver_attach+0x5b/0xb0
#1: (&__lockdep_no_validate__){......}, at: [<ffffffff81497b69>] __driver_attach+0x69/0xb0
#2: (drm_global_mutex){+.+.+.}, at: [<ffffffffa008a6dd>] drm_get_pci_dev+0xbd/0x2a0 [drm]
#3: (registration_lock){+.+.+.}, at: [<ffffffff813d93f5>] register_framebuffer+0x25/0x320
#4: (&fb_info->lock){+.+.+.}, at: [<ffffffff813d8116>] lock_fb_info+0x26/0x60
#5: (console_lock){+.+.+.}, at: [<ffffffff813d95a4>] register_framebuffer+0x1d4/0x320
#6: ((fb_notifier_list).rwsem){.+.+.+}, at: [<ffffffff8107aac6>] __blocking_notifier_call_chain+0x56/0xc0
stack backtrace:
CPU: 0 PID: 277 Comm: modprobe Not tainted 3.10.0-0+tip-xeon+lockdep #0+tip
Hardware name: Dell Inc. Precision WorkStation T5400 /0RW203, BIOS A11 04/30/2012
ffffffff8213e5e0 ffff8802aa2fb298 ffffffff81755f19 ffff8802aa2fb2e8
ffffffff8174f506 ffff8802aa2fa000 ffff8802aa2fb378 ffff8802aa2ea8e8
ffff8802aa2ea910 ffff8802aa2ea8e8 0000000000000006 0000000000000007
Call Trace:
[<ffffffff81755f19>] dump_stack+0x19/0x1b
[<ffffffff8174f506>] print_circular_bug+0x1fb/0x20c
[<ffffffff810b65c3>] __lock_acquire+0x1c43/0x1d30
[<ffffffff810b775e>] ? mark_held_locks+0xae/0x120
[<ffffffff810b78d5>] ? trace_hardirqs_on_caller+0x105/0x1d0
[<ffffffff810b6d62>] lock_acquire+0x92/0x1f0
[<ffffffff81452656>] ? tty_do_resize+0x36/0xe0
[<ffffffff8175b724>] down_write+0x44/0x70
[<ffffffff81452656>] ? tty_do_resize+0x36/0xe0
[<ffffffff81452656>] tty_do_resize+0x36/0xe0
[<ffffffff8146c841>] vc_do_resize+0x3e1/0x4c0
[<ffffffff8146c99f>] vc_resize+0x1f/0x30
[<ffffffff813e4535>] fbcon_init+0x385/0x5a0
[<ffffffff8146a4bc>] visual_init+0xbc/0x120
[<ffffffff8146cd13>] do_bind_con_driver+0x163/0x320
[<ffffffff8146cfa1>] do_take_over_console+0x61/0x70
[<ffffffff813e2b93>] do_fbcon_takeover+0x63/0xc0
[<ffffffff813e67a5>] fbcon_event_notify+0x715/0x820
[<ffffffff81762f9d>] notifier_call_chain+0x5d/0x110
[<ffffffff8107aadc>] __blocking_notifier_call_chain+0x6c/0xc0
[<ffffffff8107ab46>] blocking_notifier_call_chain+0x16/0x20
[<ffffffff813d7c0b>] fb_notifier_call_chain+0x1b/0x20
[<ffffffff813d95b2>] register_framebuffer+0x1e2/0x320
[<ffffffffa01043e1>] drm_fb_helper_initial_config+0x371/0x540 [drm_kms_helper]
[<ffffffff8173cbcb>] ? kmemleak_alloc+0x5b/0xc0
[<ffffffff81198874>] ? kmem_cache_alloc_trace+0x104/0x290
[<ffffffffa01035e1>] ? drm_fb_helper_single_add_all_connectors+0x81/0xf0 [drm_kms_helper]
[<ffffffffa01bcb05>] nouveau_fbcon_init+0x105/0x140 [nouveau]
[<ffffffffa01ad0af>] nouveau_drm_load+0x43f/0x610 [nouveau]
[<ffffffffa008a79e>] drm_get_pci_dev+0x17e/0x2a0 [drm]
[<ffffffffa01ad4da>] nouveau_drm_probe+0x25a/0x2a0 [nouveau]
[<ffffffff8175f162>] ? _raw_spin_unlock_irqrestore+0x42/0x80
[<ffffffff813b13db>] local_pci_probe+0x4b/0x80
[<ffffffff813b1701>] pci_device_probe+0x111/0x120
[<ffffffff814977eb>] driver_probe_device+0x8b/0x3a0
[<ffffffff81497bab>] __driver_attach+0xab/0xb0
[<ffffffff81497b00>] ? driver_probe_device+0x3a0/0x3a0
[<ffffffff814956ad>] bus_for_each_dev+0x5d/0xa0
[<ffffffff814971fe>] driver_attach+0x1e/0x20
[<ffffffff81496cc1>] bus_add_driver+0x111/0x290
[<ffffffffa022a000>] ? 0xffffffffa0229fff
[<ffffffff814982b7>] driver_register+0x77/0x170
[<ffffffffa022a000>] ? 0xffffffffa0229fff
[<ffffffff813b0454>] __pci_register_driver+0x64/0x70
[<ffffffffa008a9da>] drm_pci_init+0x11a/0x130 [drm]
[<ffffffffa022a000>] ? 0xffffffffa0229fff
[<ffffffffa022a000>] ? 0xffffffffa0229fff
[<ffffffffa022a04d>] nouveau_drm_init+0x4d/0x1000 [nouveau]
[<ffffffff810002ea>] do_one_initcall+0xea/0x1a0
[<ffffffff810c54cb>] load_module+0x123b/0x1bf0
[<ffffffff81399a50>] ? ddebug_proc_open+0xb0/0xb0
[<ffffffff813855ae>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[<ffffffff810c5f57>] SyS_init_module+0xd7/0x120
[<ffffffff817677c2>] system_call_fastpath+0x16/0x1b
Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2013-07-25 04:43:51 +08:00
|
|
|
struct mutex winsize_mutex;
|
2012-07-14 22:31:47 +08:00
|
|
|
struct ktermios termios, termios_locked;
|
2005-04-17 06:20:36 +08:00
|
|
|
char name[64];
|
|
|
|
unsigned long flags;
|
|
|
|
int count;
|
2021-11-26 16:15:49 +08:00
|
|
|
struct winsize winsize;
|
2021-05-05 17:19:05 +08:00
|
|
|
|
|
|
|
struct {
|
|
|
|
spinlock_t lock;
|
|
|
|
bool stopped;
|
|
|
|
bool tco_stopped;
|
|
|
|
unsigned long unused[0];
|
|
|
|
} __aligned(sizeof(unsigned long)) flow;
|
|
|
|
|
2021-05-05 17:19:06 +08:00
|
|
|
struct {
|
|
|
|
spinlock_t lock;
|
|
|
|
struct pid *pgrp;
|
|
|
|
struct pid *session;
|
|
|
|
unsigned char pktstatus;
|
|
|
|
bool packet;
|
|
|
|
unsigned long unused[0];
|
|
|
|
} __aligned(sizeof(unsigned long)) ctrl;
|
|
|
|
|
2023-03-09 16:20:35 +08:00
|
|
|
bool hw_stopped;
|
2021-11-26 16:15:49 +08:00
|
|
|
unsigned int receive_room;
|
2013-03-06 21:20:52 +08:00
|
|
|
int flow_change;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
struct tty_struct *link;
|
|
|
|
struct fasync_struct *fasync;
|
|
|
|
wait_queue_head_t write_wait;
|
|
|
|
wait_queue_head_t read_wait;
|
|
|
|
struct work_struct hangup_work;
|
|
|
|
void *disc_data;
|
|
|
|
void *driver_data;
|
2021-11-26 16:15:49 +08:00
|
|
|
spinlock_t files_lock;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct list_head tty_files;
|
|
|
|
|
|
|
|
#define N_TTY_BUF_SIZE 4096
|
2008-07-17 04:53:41 +08:00
|
|
|
|
2014-11-06 01:40:04 +08:00
|
|
|
int closing;
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned char *write_buf;
|
|
|
|
int write_cnt;
|
|
|
|
struct work_struct SAK_work;
|
2008-07-17 04:53:41 +08:00
|
|
|
struct tty_port *port;
|
2016-10-28 16:22:25 +08:00
|
|
|
} __randomize_layout;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
tty: fix fu_list abuse
tty: fix fu_list abuse
tty code abuses fu_list, which causes a bug in remount,ro handling.
If a tty device node is opened on a filesystem, then the last link to the inode
removed, the filesystem will be allowed to be remounted readonly. This is
because fs_may_remount_ro does not find the 0 link tty inode on the file sb
list (because the tty code incorrectly removed it to use for its own purpose).
This can result in a filesystem with errors after it is marked "clean".
Taking idea from Christoph's initial patch, allocate a tty private struct
at file->private_data and put our required list fields in there, linking
file and tty. This makes tty nodes behave the same way as other device nodes
and avoid meddling with the vfs, and avoids this bug.
The error handling is not trivial in the tty code, so for this bugfix, I take
the simple approach of using __GFP_NOFAIL and don't worry about memory errors.
This is not a problem because our allocator doesn't fail small allocs as a rule
anyway. So proper error handling is left as an exercise for tty hackers.
[ Arguably filesystem's device inode would ideally be divorced from the
driver's pseudo inode when it is opened, but in practice it's not clear whether
that will ever be worth implementing. ]
Cc: linux-kernel@vger.kernel.org
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Nick Piggin <npiggin@kernel.dk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2010-08-18 02:37:36 +08:00
|
|
|
/* Each of a tty's open files has private_data pointing to tty_file_private */
|
|
|
|
struct tty_file_private {
|
|
|
|
struct tty_struct *tty;
|
|
|
|
struct file *file;
|
|
|
|
struct list_head list;
|
|
|
|
};
|
|
|
|
|
2021-11-26 16:15:57 +08:00
|
|
|
/**
|
|
|
|
* DOC: TTY Struct Flags
|
|
|
|
*
|
|
|
|
* These bits are used in the :c:member:`tty_struct.flags` field.
|
2008-07-17 04:54:54 +08:00
|
|
|
*
|
2005-04-17 06:20:36 +08:00
|
|
|
* So that interrupts won't be able to mess up the queues,
|
|
|
|
* copy_to_cooked must be atomic with respect to itself, as must
|
|
|
|
* tty->write. Thus, you must use the inline functions set_bit() and
|
|
|
|
* clear_bit() to make things atomic.
|
2021-11-26 16:15:57 +08:00
|
|
|
*
|
|
|
|
* TTY_THROTTLED
|
|
|
|
* Driver input is throttled. The ldisc should call
|
|
|
|
* :c:member:`tty_driver.unthrottle()` in order to resume reception when
|
|
|
|
* it is ready to process more data (at threshold min).
|
|
|
|
*
|
|
|
|
* TTY_IO_ERROR
|
|
|
|
* If set, causes all subsequent userspace read/write calls on the tty to
|
|
|
|
* fail, returning -%EIO. (May be no ldisc too.)
|
|
|
|
*
|
|
|
|
* TTY_OTHER_CLOSED
|
|
|
|
* Device is a pty and the other side has closed.
|
|
|
|
*
|
|
|
|
* TTY_EXCLUSIVE
|
|
|
|
* Exclusive open mode (a single opener).
|
|
|
|
*
|
|
|
|
* TTY_DO_WRITE_WAKEUP
|
|
|
|
* If set, causes the driver to call the
|
|
|
|
* :c:member:`tty_ldisc_ops.write_wakeup()` method in order to resume
|
|
|
|
* transmission when it can accept more data to transmit.
|
|
|
|
*
|
|
|
|
* TTY_LDISC_OPEN
|
|
|
|
* Indicates that a line discipline is open. For debugging purposes only.
|
|
|
|
*
|
|
|
|
* TTY_PTY_LOCK
|
|
|
|
* A flag private to pty code to implement %TIOCSPTLCK/%TIOCGPTLCK logic.
|
|
|
|
*
|
|
|
|
* TTY_NO_WRITE_SPLIT
|
|
|
|
* Prevent driver from splitting up writes into smaller chunks (preserve
|
|
|
|
* write boundaries to driver).
|
|
|
|
*
|
|
|
|
* TTY_HUPPED
|
|
|
|
* The TTY was hung up. This is set post :c:member:`tty_driver.hangup()`.
|
|
|
|
*
|
|
|
|
* TTY_HUPPING
|
|
|
|
* The TTY is in the process of hanging up to abort potential readers.
|
|
|
|
*
|
|
|
|
* TTY_LDISC_CHANGING
|
|
|
|
* Line discipline for this TTY is being changed. I/O should not block
|
|
|
|
* when this is set. Use tty_io_nonblock() to check.
|
|
|
|
*
|
|
|
|
* TTY_LDISC_HALTED
|
|
|
|
* Line discipline for this TTY was stopped. No work should be queued to
|
|
|
|
* this ldisc.
|
2005-04-17 06:20:36 +08:00
|
|
|
*/
|
2021-11-26 16:15:57 +08:00
|
|
|
#define TTY_THROTTLED 0
|
|
|
|
#define TTY_IO_ERROR 1
|
|
|
|
#define TTY_OTHER_CLOSED 2
|
|
|
|
#define TTY_EXCLUSIVE 3
|
|
|
|
#define TTY_DO_WRITE_WAKEUP 5
|
|
|
|
#define TTY_LDISC_OPEN 11
|
|
|
|
#define TTY_PTY_LOCK 16
|
|
|
|
#define TTY_NO_WRITE_SPLIT 17
|
|
|
|
#define TTY_HUPPED 18
|
|
|
|
#define TTY_HUPPING 19
|
|
|
|
#define TTY_LDISC_CHANGING 20
|
|
|
|
#define TTY_LDISC_HALTED 22
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2018-11-01 08:24:48 +08:00
|
|
|
static inline bool tty_io_nonblock(struct tty_struct *tty, struct file *file)
|
|
|
|
{
|
|
|
|
return file->f_flags & O_NONBLOCK ||
|
|
|
|
test_bit(TTY_LDISC_CHANGING, &tty->flags);
|
|
|
|
}
|
|
|
|
|
2016-04-10 08:06:48 +08:00
|
|
|
static inline bool tty_io_error(struct tty_struct *tty)
|
|
|
|
{
|
|
|
|
return test_bit(TTY_IO_ERROR, &tty->flags);
|
|
|
|
}
|
|
|
|
|
2016-04-10 08:11:36 +08:00
|
|
|
static inline bool tty_throttled(struct tty_struct *tty)
|
|
|
|
{
|
|
|
|
return test_bit(TTY_THROTTLED, &tty->flags);
|
|
|
|
}
|
|
|
|
|
2013-01-18 14:44:22 +08:00
|
|
|
#ifdef CONFIG_TTY
|
2021-09-14 17:11:21 +08:00
|
|
|
void tty_kref_put(struct tty_struct *tty);
|
|
|
|
struct pid *tty_get_pgrp(struct tty_struct *tty);
|
|
|
|
void tty_vhangup_self(void);
|
|
|
|
void disassociate_ctty(int priv);
|
|
|
|
dev_t tty_devnum(struct tty_struct *tty);
|
|
|
|
void proc_clear_tty(struct task_struct *p);
|
|
|
|
struct tty_struct *get_current_tty(void);
|
2013-01-18 14:44:22 +08:00
|
|
|
/* tty_io.c */
|
2021-09-14 17:11:21 +08:00
|
|
|
int __init tty_init(void);
|
|
|
|
const char *tty_name(const struct tty_struct *tty);
|
|
|
|
struct tty_struct *tty_kopen_exclusive(dev_t device);
|
|
|
|
struct tty_struct *tty_kopen_shared(dev_t device);
|
|
|
|
void tty_kclose(struct tty_struct *tty);
|
|
|
|
int tty_dev_name_to_number(const char *name, dev_t *number);
|
2013-01-18 14:44:22 +08:00
|
|
|
#else
|
|
|
|
static inline void tty_kref_put(struct tty_struct *tty)
|
|
|
|
{ }
|
|
|
|
static inline struct pid *tty_get_pgrp(struct tty_struct *tty)
|
|
|
|
{ return NULL; }
|
|
|
|
static inline void tty_vhangup_self(void)
|
|
|
|
{ }
|
|
|
|
static inline void disassociate_ctty(int priv)
|
|
|
|
{ }
|
|
|
|
static inline dev_t tty_devnum(struct tty_struct *tty)
|
|
|
|
{ return 0; }
|
|
|
|
static inline void proc_clear_tty(struct task_struct *p)
|
|
|
|
{ }
|
|
|
|
static inline struct tty_struct *get_current_tty(void)
|
|
|
|
{ return NULL; }
|
|
|
|
/* tty_io.c */
|
|
|
|
static inline int __init tty_init(void)
|
|
|
|
{ return 0; }
|
2016-04-27 17:56:04 +08:00
|
|
|
static inline const char *tty_name(const struct tty_struct *tty)
|
|
|
|
{ return "(none)"; }
|
2020-12-18 18:42:44 +08:00
|
|
|
static inline struct tty_struct *tty_kopen_exclusive(dev_t device)
|
2017-07-20 15:22:36 +08:00
|
|
|
{ return ERR_PTR(-ENODEV); }
|
|
|
|
static inline void tty_kclose(struct tty_struct *tty)
|
|
|
|
{ }
|
2017-06-26 02:40:00 +08:00
|
|
|
static inline int tty_dev_name_to_number(const char *name, dev_t *number)
|
|
|
|
{ return -ENOTSUPP; }
|
2013-01-18 14:44:22 +08:00
|
|
|
#endif
|
|
|
|
|
2006-12-08 18:38:44 +08:00
|
|
|
extern struct ktermios tty_std_termios;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2021-09-14 17:11:21 +08:00
|
|
|
int vcs_init(void);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2023-04-03 01:58:50 +08:00
|
|
|
extern const struct class tty_class;
|
2008-10-13 17:41:42 +08:00
|
|
|
|
2008-10-13 17:37:26 +08:00
|
|
|
/**
|
|
|
|
* tty_kref_get - get a tty reference
|
|
|
|
* @tty: tty device
|
|
|
|
*
|
|
|
|
* Return a new reference to a tty object. The caller must hold
|
|
|
|
* sufficient locks/counts to ensure that their existing reference cannot
|
|
|
|
* go away
|
|
|
|
*/
|
|
|
|
|
2008-11-25 15:58:11 +08:00
|
|
|
static inline struct tty_struct *tty_kref_get(struct tty_struct *tty)
|
2008-10-13 17:37:26 +08:00
|
|
|
{
|
|
|
|
if (tty)
|
|
|
|
kref_get(&tty->kref);
|
|
|
|
return tty;
|
|
|
|
}
|
|
|
|
|
2021-09-14 17:11:21 +08:00
|
|
|
const char *tty_driver_name(const struct tty_struct *tty);
|
|
|
|
void tty_wait_until_sent(struct tty_struct *tty, long timeout);
|
|
|
|
void stop_tty(struct tty_struct *tty);
|
|
|
|
void start_tty(struct tty_struct *tty);
|
|
|
|
void tty_write_message(struct tty_struct *tty, char *msg);
|
|
|
|
int tty_send_xchar(struct tty_struct *tty, char ch);
|
|
|
|
int tty_put_char(struct tty_struct *tty, unsigned char c);
|
|
|
|
unsigned int tty_chars_in_buffer(struct tty_struct *tty);
|
|
|
|
unsigned int tty_write_room(struct tty_struct *tty);
|
|
|
|
void tty_driver_flush_buffer(struct tty_struct *tty);
|
|
|
|
void tty_unthrottle(struct tty_struct *tty);
|
|
|
|
int tty_throttle_safe(struct tty_struct *tty);
|
|
|
|
int tty_unthrottle_safe(struct tty_struct *tty);
|
|
|
|
int tty_do_resize(struct tty_struct *tty, struct winsize *ws);
|
|
|
|
int tty_get_icount(struct tty_struct *tty,
|
|
|
|
struct serial_icounter_struct *icount);
|
|
|
|
int is_current_pgrp_orphaned(void);
|
|
|
|
void tty_hangup(struct tty_struct *tty);
|
|
|
|
void tty_vhangup(struct tty_struct *tty);
|
|
|
|
int tty_hung_up_p(struct file *filp);
|
|
|
|
void do_SAK(struct tty_struct *tty);
|
|
|
|
void __do_SAK(struct tty_struct *tty);
|
|
|
|
void no_tty(void);
|
2022-08-16 19:57:32 +08:00
|
|
|
speed_t tty_termios_baud_rate(const struct ktermios *termios);
|
2021-09-14 17:11:21 +08:00
|
|
|
void tty_termios_encode_baud_rate(struct ktermios *termios, speed_t ibaud,
|
|
|
|
speed_t obaud);
|
|
|
|
void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud,
|
|
|
|
speed_t obaud);
|
2013-03-07 20:12:27 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* tty_get_baud_rate - get tty bit rates
|
|
|
|
* @tty: tty to query
|
|
|
|
*
|
|
|
|
* Returns the baud rate as an integer for this terminal. The
|
|
|
|
* termios lock must be held by the caller and the terminal bit
|
|
|
|
* flags may be updated.
|
|
|
|
*
|
|
|
|
* Locking: none
|
|
|
|
*/
|
|
|
|
static inline speed_t tty_get_baud_rate(struct tty_struct *tty)
|
|
|
|
{
|
|
|
|
return tty_termios_baud_rate(&tty->termios);
|
|
|
|
}
|
|
|
|
|
2021-06-10 17:02:44 +08:00
|
|
|
unsigned char tty_get_char_size(unsigned int cflag);
|
|
|
|
unsigned char tty_get_frame_size(unsigned int cflag);
|
|
|
|
|
2022-08-16 19:57:35 +08:00
|
|
|
void tty_termios_copy_hw(struct ktermios *new, const struct ktermios *old);
|
2023-01-17 17:03:56 +08:00
|
|
|
bool tty_termios_hw_change(const struct ktermios *a, const struct ktermios *b);
|
2021-09-14 17:11:21 +08:00
|
|
|
int tty_set_termios(struct tty_struct *tty, struct ktermios *kt);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2021-09-14 17:11:21 +08:00
|
|
|
void tty_wakeup(struct tty_struct *tty);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2021-09-14 17:11:23 +08:00
|
|
|
int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg);
|
2021-09-14 17:11:21 +08:00
|
|
|
int tty_perform_flush(struct tty_struct *tty, unsigned long arg);
|
|
|
|
struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx);
|
|
|
|
void tty_release_struct(struct tty_struct *tty, int idx);
|
|
|
|
void tty_init_termios(struct tty_struct *tty);
|
|
|
|
void tty_save_termios(struct tty_struct *tty);
|
|
|
|
int tty_standard_install(struct tty_driver *driver,
|
2012-01-31 04:14:28 +08:00
|
|
|
struct tty_struct *tty);
|
2006-12-08 18:36:04 +08:00
|
|
|
|
2006-03-23 19:00:31 +08:00
|
|
|
extern struct mutex tty_mutex;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* n_tty.c */
|
2021-09-14 17:11:21 +08:00
|
|
|
void n_tty_inherit_ops(struct tty_ldisc_ops *ops);
|
2017-04-13 06:37:14 +08:00
|
|
|
#ifdef CONFIG_TTY
|
2021-09-14 17:11:21 +08:00
|
|
|
void __init n_tty_init(void);
|
2017-04-13 06:37:14 +08:00
|
|
|
#else
|
|
|
|
static inline void n_tty_init(void) { }
|
|
|
|
#endif
|
2005-04-17 06:20:36 +08:00
|
|
|
|
Audit: add TTY input auditing
Add TTY input auditing, used to audit system administrator's actions. This is
required by various security standards such as DCID 6/3 and PCI to provide
non-repudiation of administrator's actions and to allow a review of past
actions if the administrator seems to overstep their duties or if the system
becomes misconfigured for unknown reasons. These requirements do not make it
necessary to audit TTY output as well.
Compared to an user-space keylogger, this approach records TTY input using the
audit subsystem, correlated with other audit events, and it is completely
transparent to the user-space application (e.g. the console ioctls still
work).
TTY input auditing works on a higher level than auditing all system calls
within the session, which would produce an overwhelming amount of mostly
useless audit events.
Add an "audit_tty" attribute, inherited across fork (). Data read from TTYs
by process with the attribute is sent to the audit subsystem by the kernel.
The audit netlink interface is extended to allow modifying the audit_tty
attribute, and to allow sending explanatory audit events from user-space (for
example, a shell might send an event containing the final command, after the
interactive command-line editing and history expansion is performed, which
might be difficult to decipher from the TTY input alone).
Because the "audit_tty" attribute is inherited across fork (), it would be set
e.g. for sshd restarted within an audited session. To prevent this, the
audit_tty attribute is cleared when a process with no open TTY file
descriptors (e.g. after daemon startup) opens a TTY.
See https://www.redhat.com/archives/linux-audit/2007-June/msg00000.html for a
more detailed rationale document for an older version of this patch.
[akpm@linux-foundation.org: build fix]
Signed-off-by: Miloslav Trmac <mitr@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Paul Fulghum <paulkf@microgate.com>
Cc: Casey Schaufler <casey@schaufler-ca.com>
Cc: Steve Grubb <sgrubb@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-16 14:40:56 +08:00
|
|
|
/* tty_audit.c */
|
|
|
|
#ifdef CONFIG_AUDIT
|
2021-09-14 17:11:21 +08:00
|
|
|
void tty_audit_exit(void);
|
|
|
|
void tty_audit_fork(struct signal_struct *sig);
|
|
|
|
int tty_audit_push(void);
|
Audit: add TTY input auditing
Add TTY input auditing, used to audit system administrator's actions. This is
required by various security standards such as DCID 6/3 and PCI to provide
non-repudiation of administrator's actions and to allow a review of past
actions if the administrator seems to overstep their duties or if the system
becomes misconfigured for unknown reasons. These requirements do not make it
necessary to audit TTY output as well.
Compared to an user-space keylogger, this approach records TTY input using the
audit subsystem, correlated with other audit events, and it is completely
transparent to the user-space application (e.g. the console ioctls still
work).
TTY input auditing works on a higher level than auditing all system calls
within the session, which would produce an overwhelming amount of mostly
useless audit events.
Add an "audit_tty" attribute, inherited across fork (). Data read from TTYs
by process with the attribute is sent to the audit subsystem by the kernel.
The audit netlink interface is extended to allow modifying the audit_tty
attribute, and to allow sending explanatory audit events from user-space (for
example, a shell might send an event containing the final command, after the
interactive command-line editing and history expansion is performed, which
might be difficult to decipher from the TTY input alone).
Because the "audit_tty" attribute is inherited across fork (), it would be set
e.g. for sshd restarted within an audited session. To prevent this, the
audit_tty attribute is cleared when a process with no open TTY file
descriptors (e.g. after daemon startup) opens a TTY.
See https://www.redhat.com/archives/linux-audit/2007-June/msg00000.html for a
more detailed rationale document for an older version of this patch.
[akpm@linux-foundation.org: build fix]
Signed-off-by: Miloslav Trmac <mitr@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Paul Fulghum <paulkf@microgate.com>
Cc: Casey Schaufler <casey@schaufler-ca.com>
Cc: Steve Grubb <sgrubb@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-16 14:40:56 +08:00
|
|
|
#else
|
|
|
|
static inline void tty_audit_exit(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
static inline void tty_audit_fork(struct signal_struct *sig)
|
|
|
|
{
|
|
|
|
}
|
2016-01-10 14:55:31 +08:00
|
|
|
static inline int tty_audit_push(void)
|
Audit: add TTY input auditing
Add TTY input auditing, used to audit system administrator's actions. This is
required by various security standards such as DCID 6/3 and PCI to provide
non-repudiation of administrator's actions and to allow a review of past
actions if the administrator seems to overstep their duties or if the system
becomes misconfigured for unknown reasons. These requirements do not make it
necessary to audit TTY output as well.
Compared to an user-space keylogger, this approach records TTY input using the
audit subsystem, correlated with other audit events, and it is completely
transparent to the user-space application (e.g. the console ioctls still
work).
TTY input auditing works on a higher level than auditing all system calls
within the session, which would produce an overwhelming amount of mostly
useless audit events.
Add an "audit_tty" attribute, inherited across fork (). Data read from TTYs
by process with the attribute is sent to the audit subsystem by the kernel.
The audit netlink interface is extended to allow modifying the audit_tty
attribute, and to allow sending explanatory audit events from user-space (for
example, a shell might send an event containing the final command, after the
interactive command-line editing and history expansion is performed, which
might be difficult to decipher from the TTY input alone).
Because the "audit_tty" attribute is inherited across fork (), it would be set
e.g. for sshd restarted within an audited session. To prevent this, the
audit_tty attribute is cleared when a process with no open TTY file
descriptors (e.g. after daemon startup) opens a TTY.
See https://www.redhat.com/archives/linux-audit/2007-June/msg00000.html for a
more detailed rationale document for an older version of this patch.
[akpm@linux-foundation.org: build fix]
Signed-off-by: Miloslav Trmac <mitr@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Paul Fulghum <paulkf@microgate.com>
Cc: Casey Schaufler <casey@schaufler-ca.com>
Cc: Steve Grubb <sgrubb@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-16 14:40:56 +08:00
|
|
|
{
|
2009-12-09 22:19:31 +08:00
|
|
|
return 0;
|
Audit: add TTY input auditing
Add TTY input auditing, used to audit system administrator's actions. This is
required by various security standards such as DCID 6/3 and PCI to provide
non-repudiation of administrator's actions and to allow a review of past
actions if the administrator seems to overstep their duties or if the system
becomes misconfigured for unknown reasons. These requirements do not make it
necessary to audit TTY output as well.
Compared to an user-space keylogger, this approach records TTY input using the
audit subsystem, correlated with other audit events, and it is completely
transparent to the user-space application (e.g. the console ioctls still
work).
TTY input auditing works on a higher level than auditing all system calls
within the session, which would produce an overwhelming amount of mostly
useless audit events.
Add an "audit_tty" attribute, inherited across fork (). Data read from TTYs
by process with the attribute is sent to the audit subsystem by the kernel.
The audit netlink interface is extended to allow modifying the audit_tty
attribute, and to allow sending explanatory audit events from user-space (for
example, a shell might send an event containing the final command, after the
interactive command-line editing and history expansion is performed, which
might be difficult to decipher from the TTY input alone).
Because the "audit_tty" attribute is inherited across fork (), it would be set
e.g. for sshd restarted within an audited session. To prevent this, the
audit_tty attribute is cleared when a process with no open TTY file
descriptors (e.g. after daemon startup) opens a TTY.
See https://www.redhat.com/archives/linux-audit/2007-June/msg00000.html for a
more detailed rationale document for an older version of this patch.
[akpm@linux-foundation.org: build fix]
Signed-off-by: Miloslav Trmac <mitr@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Paul Fulghum <paulkf@microgate.com>
Cc: Casey Schaufler <casey@schaufler-ca.com>
Cc: Steve Grubb <sgrubb@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-16 14:40:56 +08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* tty_ioctl.c */
|
2021-09-14 17:11:24 +08:00
|
|
|
int n_tty_ioctl_helper(struct tty_struct *tty, unsigned int cmd,
|
|
|
|
unsigned long arg);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* vt.c */
|
|
|
|
|
2021-09-14 17:11:21 +08:00
|
|
|
int vt_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2021-09-14 17:11:21 +08:00
|
|
|
long vt_compat_ioctl(struct tty_struct *tty, unsigned int cmd,
|
|
|
|
unsigned long arg);
|
2009-08-06 21:09:28 +08:00
|
|
|
|
2010-08-07 03:40:30 +08:00
|
|
|
/* tty_mutex.c */
|
2010-06-02 04:53:01 +08:00
|
|
|
/* functions for preparation of BKL removal */
|
2021-09-14 17:11:21 +08:00
|
|
|
void tty_lock(struct tty_struct *tty);
|
|
|
|
int tty_lock_interruptible(struct tty_struct *tty);
|
|
|
|
void tty_unlock(struct tty_struct *tty);
|
|
|
|
void tty_lock_slave(struct tty_struct *tty);
|
|
|
|
void tty_unlock_slave(struct tty_struct *tty);
|
|
|
|
void tty_set_lock_subclass(struct tty_struct *tty);
|
2010-06-02 04:53:05 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#endif
|