blob: 58190135efb7dd3088f9895cdceb1e01a646d7c8 [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001// SPDX-License-Identifier: GPL-1.0+
2/*
3 * n_tty.c --- implements the N_TTY line discipline.
4 *
5 * This code used to be in tty_io.c, but things are getting hairy
6 * enough that it made sense to split things off. (The N_TTY
7 * processing has changed so much that it's hardly recognizable,
8 * anyway...)
9 *
10 * Note that the open routine for N_TTY is guaranteed never to return
11 * an error. This is because Linux will fall back to setting a line
12 * to N_TTY if it can not switch to any other line discipline.
13 *
14 * Written by Theodore Ts'o, Copyright 1994.
15 *
16 * This file also contains code originally written by Linus Torvalds,
17 * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994.
18 *
19 * Reduced memory usage for older ARM systems - Russell King.
20 *
21 * 2000/01/20 Fixed SMP locking on put_tty_queue using bits of
22 * the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu>
23 * who actually finally proved there really was a race.
24 *
25 * 2002/03/18 Implemented n_tty_wakeup to send SIGIO POLL_OUTs to
26 * waiting writing processes-Sapan Bhatia <sapan@corewars.org>.
27 * Also fixed a bug in BLOCKING mode where n_tty_write returns
28 * EAGAIN
29 */
30
31#include <linux/types.h>
32#include <linux/major.h>
33#include <linux/errno.h>
34#include <linux/signal.h>
35#include <linux/fcntl.h>
36#include <linux/sched.h>
37#include <linux/interrupt.h>
38#include <linux/tty.h>
39#include <linux/timer.h>
40#include <linux/ctype.h>
41#include <linux/mm.h>
42#include <linux/string.h>
43#include <linux/slab.h>
44#include <linux/poll.h>
45#include <linux/bitops.h>
46#include <linux/audit.h>
47#include <linux/file.h>
48#include <linux/uaccess.h>
49#include <linux/module.h>
50#include <linux/ratelimit.h>
51#include <linux/vmalloc.h>
52
David Brazdil0f672f62019-12-10 10:32:29 +000053/*
54 * Until this number of characters is queued in the xmit buffer, select will
55 * return "we have room for writes".
56 */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000057#define WAKEUP_CHARS 256
58
59/*
60 * This defines the low- and high-watermarks for throttling and
61 * unthrottling the TTY driver. These watermarks are used for
62 * controlling the space in the read buffer.
63 */
64#define TTY_THRESHOLD_THROTTLE 128 /* now based on remaining room */
65#define TTY_THRESHOLD_UNTHROTTLE 128
66
67/*
68 * Special byte codes used in the echo buffer to represent operations
69 * or special handling of characters. Bytes in the echo buffer that
70 * are not part of such special blocks are treated as normal character
71 * codes.
72 */
73#define ECHO_OP_START 0xff
74#define ECHO_OP_MOVE_BACK_COL 0x80
75#define ECHO_OP_SET_CANON_COL 0x81
76#define ECHO_OP_ERASE_TAB 0x82
77
78#define ECHO_COMMIT_WATERMARK 256
79#define ECHO_BLOCK 256
80#define ECHO_DISCARD_WATERMARK N_TTY_BUF_SIZE - (ECHO_BLOCK + 32)
81
82
83#undef N_TTY_TRACE
84#ifdef N_TTY_TRACE
85# define n_tty_trace(f, args...) trace_printk(f, ##args)
86#else
Olivier Deprez157378f2022-04-04 15:47:50 +020087# define n_tty_trace(f, args...) no_printk(f, ##args)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000088#endif
89
90struct n_tty_data {
91 /* producer-published */
92 size_t read_head;
93 size_t commit_head;
94 size_t canon_head;
95 size_t echo_head;
96 size_t echo_commit;
97 size_t echo_mark;
98 DECLARE_BITMAP(char_map, 256);
99
100 /* private to n_tty_receive_overrun (single-threaded) */
101 unsigned long overrun_time;
102 int num_overrun;
103
104 /* non-atomic */
105 bool no_room;
106
107 /* must hold exclusive termios_rwsem to reset these */
108 unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
109 unsigned char push:1;
110
111 /* shared by producer and consumer */
112 char read_buf[N_TTY_BUF_SIZE];
113 DECLARE_BITMAP(read_flags, N_TTY_BUF_SIZE);
114 unsigned char echo_buf[N_TTY_BUF_SIZE];
115
116 /* consumer-published */
117 size_t read_tail;
118 size_t line_start;
119
120 /* protected by output lock */
121 unsigned int column;
122 unsigned int canon_column;
123 size_t echo_tail;
124
125 struct mutex atomic_read_lock;
126 struct mutex output_lock;
127};
128
129#define MASK(x) ((x) & (N_TTY_BUF_SIZE - 1))
130
131static inline size_t read_cnt(struct n_tty_data *ldata)
132{
133 return ldata->read_head - ldata->read_tail;
134}
135
136static inline unsigned char read_buf(struct n_tty_data *ldata, size_t i)
137{
138 return ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
139}
140
141static inline unsigned char *read_buf_addr(struct n_tty_data *ldata, size_t i)
142{
143 return &ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
144}
145
146static inline unsigned char echo_buf(struct n_tty_data *ldata, size_t i)
147{
148 smp_rmb(); /* Matches smp_wmb() in add_echo_byte(). */
149 return ldata->echo_buf[i & (N_TTY_BUF_SIZE - 1)];
150}
151
152static inline unsigned char *echo_buf_addr(struct n_tty_data *ldata, size_t i)
153{
154 return &ldata->echo_buf[i & (N_TTY_BUF_SIZE - 1)];
155}
156
157/* If we are not echoing the data, perhaps this is a secret so erase it */
158static void zero_buffer(struct tty_struct *tty, u8 *buffer, int size)
159{
160 bool icanon = !!L_ICANON(tty);
161 bool no_echo = !L_ECHO(tty);
162
163 if (icanon && no_echo)
164 memset(buffer, 0x00, size);
165}
166
Olivier Deprez157378f2022-04-04 15:47:50 +0200167static void tty_copy(struct tty_struct *tty, void *to, size_t tail, size_t n)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000168{
169 struct n_tty_data *ldata = tty->disc_data;
170 size_t size = N_TTY_BUF_SIZE - tail;
171 void *from = read_buf_addr(ldata, tail);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000172
173 if (n > size) {
174 tty_audit_add_data(tty, from, size);
Olivier Deprez157378f2022-04-04 15:47:50 +0200175 memcpy(to, from, size);
176 zero_buffer(tty, from, size);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000177 to += size;
178 n -= size;
179 from = ldata->read_buf;
180 }
181
182 tty_audit_add_data(tty, from, n);
Olivier Deprez157378f2022-04-04 15:47:50 +0200183 memcpy(to, from, n);
184 zero_buffer(tty, from, n);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000185}
186
187/**
188 * n_tty_kick_worker - start input worker (if required)
189 * @tty: terminal
190 *
191 * Re-schedules the flip buffer work if it may have stopped
192 *
193 * Caller holds exclusive termios_rwsem
194 * or
195 * n_tty_read()/consumer path:
196 * holds non-exclusive termios_rwsem
197 */
198
199static void n_tty_kick_worker(struct tty_struct *tty)
200{
201 struct n_tty_data *ldata = tty->disc_data;
202
203 /* Did the input worker stop? Restart it */
204 if (unlikely(ldata->no_room)) {
205 ldata->no_room = 0;
206
207 WARN_RATELIMIT(tty->port->itty == NULL,
208 "scheduling with invalid itty\n");
209 /* see if ldisc has been killed - if so, this means that
210 * even though the ldisc has been halted and ->buf.work
211 * cancelled, ->buf.work is about to be rescheduled
212 */
213 WARN_RATELIMIT(test_bit(TTY_LDISC_HALTED, &tty->flags),
214 "scheduling buffer work for halted ldisc\n");
215 tty_buffer_restart_work(tty->port);
216 }
217}
218
219static ssize_t chars_in_buffer(struct tty_struct *tty)
220{
221 struct n_tty_data *ldata = tty->disc_data;
222 ssize_t n = 0;
223
224 if (!ldata->icanon)
225 n = ldata->commit_head - ldata->read_tail;
226 else
227 n = ldata->canon_head - ldata->read_tail;
228 return n;
229}
230
231/**
232 * n_tty_write_wakeup - asynchronous I/O notifier
233 * @tty: tty device
234 *
235 * Required for the ptys, serial driver etc. since processes
236 * that attach themselves to the master and rely on ASYNC
237 * IO must be woken up
238 */
239
240static void n_tty_write_wakeup(struct tty_struct *tty)
241{
242 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
243 kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
244}
245
246static void n_tty_check_throttle(struct tty_struct *tty)
247{
248 struct n_tty_data *ldata = tty->disc_data;
249
250 /*
251 * Check the remaining room for the input canonicalization
252 * mode. We don't want to throttle the driver if we're in
253 * canonical mode and don't have a newline yet!
254 */
255 if (ldata->icanon && ldata->canon_head == ldata->read_tail)
256 return;
257
258 while (1) {
259 int throttled;
260 tty_set_flow_change(tty, TTY_THROTTLE_SAFE);
261 if (N_TTY_BUF_SIZE - read_cnt(ldata) >= TTY_THRESHOLD_THROTTLE)
262 break;
263 throttled = tty_throttle_safe(tty);
264 if (!throttled)
265 break;
266 }
267 __tty_set_flow_change(tty, 0);
268}
269
270static void n_tty_check_unthrottle(struct tty_struct *tty)
271{
272 if (tty->driver->type == TTY_DRIVER_TYPE_PTY) {
273 if (chars_in_buffer(tty) > TTY_THRESHOLD_UNTHROTTLE)
274 return;
275 n_tty_kick_worker(tty);
276 tty_wakeup(tty->link);
277 return;
278 }
279
280 /* If there is enough space in the read buffer now, let the
281 * low-level driver know. We use chars_in_buffer() to
282 * check the buffer, as it now knows about canonical mode.
283 * Otherwise, if the driver is throttled and the line is
284 * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
285 * we won't get any more characters.
286 */
287
288 while (1) {
289 int unthrottled;
290 tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);
291 if (chars_in_buffer(tty) > TTY_THRESHOLD_UNTHROTTLE)
292 break;
293 n_tty_kick_worker(tty);
294 unthrottled = tty_unthrottle_safe(tty);
295 if (!unthrottled)
296 break;
297 }
298 __tty_set_flow_change(tty, 0);
299}
300
301/**
302 * put_tty_queue - add character to tty
303 * @c: character
304 * @ldata: n_tty data
305 *
306 * Add a character to the tty read_buf queue.
307 *
308 * n_tty_receive_buf()/producer path:
309 * caller holds non-exclusive termios_rwsem
310 */
311
312static inline void put_tty_queue(unsigned char c, struct n_tty_data *ldata)
313{
314 *read_buf_addr(ldata, ldata->read_head) = c;
315 ldata->read_head++;
316}
317
318/**
319 * reset_buffer_flags - reset buffer state
Olivier Deprez157378f2022-04-04 15:47:50 +0200320 * @ldata: line disc data to reset
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000321 *
322 * Reset the read buffer counters and clear the flags.
323 * Called from n_tty_open() and n_tty_flush_buffer().
324 *
325 * Locking: caller holds exclusive termios_rwsem
326 * (or locking is not required)
327 */
328
329static void reset_buffer_flags(struct n_tty_data *ldata)
330{
331 ldata->read_head = ldata->canon_head = ldata->read_tail = 0;
332 ldata->commit_head = 0;
333 ldata->line_start = 0;
334
335 ldata->erasing = 0;
336 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
337 ldata->push = 0;
338}
339
340static void n_tty_packet_mode_flush(struct tty_struct *tty)
341{
342 unsigned long flags;
343
344 if (tty->link->packet) {
345 spin_lock_irqsave(&tty->ctrl_lock, flags);
346 tty->ctrl_status |= TIOCPKT_FLUSHREAD;
347 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
348 wake_up_interruptible(&tty->link->read_wait);
349 }
350}
351
352/**
353 * n_tty_flush_buffer - clean input queue
354 * @tty: terminal device
355 *
356 * Flush the input buffer. Called when the tty layer wants the
357 * buffer flushed (eg at hangup) or when the N_TTY line discipline
358 * internally has to clean the pending queue (for example some signals).
359 *
360 * Holds termios_rwsem to exclude producer/consumer while
361 * buffer indices are reset.
362 *
363 * Locking: ctrl_lock, exclusive termios_rwsem
364 */
365
366static void n_tty_flush_buffer(struct tty_struct *tty)
367{
368 down_write(&tty->termios_rwsem);
369 reset_buffer_flags(tty->disc_data);
370 n_tty_kick_worker(tty);
371
372 if (tty->link)
373 n_tty_packet_mode_flush(tty);
374 up_write(&tty->termios_rwsem);
375}
376
377/**
378 * is_utf8_continuation - utf8 multibyte check
379 * @c: byte to check
380 *
381 * Returns true if the utf8 character 'c' is a multibyte continuation
382 * character. We use this to correctly compute the on screen size
383 * of the character when printing
384 */
385
386static inline int is_utf8_continuation(unsigned char c)
387{
388 return (c & 0xc0) == 0x80;
389}
390
391/**
392 * is_continuation - multibyte check
393 * @c: byte to check
394 *
395 * Returns true if the utf8 character 'c' is a multibyte continuation
396 * character and the terminal is in unicode mode.
397 */
398
399static inline int is_continuation(unsigned char c, struct tty_struct *tty)
400{
401 return I_IUTF8(tty) && is_utf8_continuation(c);
402}
403
404/**
405 * do_output_char - output one character
406 * @c: character (or partial unicode symbol)
407 * @tty: terminal device
408 * @space: space available in tty driver write buffer
409 *
410 * This is a helper function that handles one output character
411 * (including special characters like TAB, CR, LF, etc.),
412 * doing OPOST processing and putting the results in the
413 * tty driver's write buffer.
414 *
415 * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY
416 * and NLDLY. They simply aren't relevant in the world today.
417 * If you ever need them, add them here.
418 *
419 * Returns the number of bytes of buffer space used or -1 if
420 * no space left.
421 *
422 * Locking: should be called under the output_lock to protect
423 * the column state and space left in the buffer
424 */
425
426static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
427{
428 struct n_tty_data *ldata = tty->disc_data;
429 int spaces;
430
431 if (!space)
432 return -1;
433
434 switch (c) {
435 case '\n':
436 if (O_ONLRET(tty))
437 ldata->column = 0;
438 if (O_ONLCR(tty)) {
439 if (space < 2)
440 return -1;
441 ldata->canon_column = ldata->column = 0;
442 tty->ops->write(tty, "\r\n", 2);
443 return 2;
444 }
445 ldata->canon_column = ldata->column;
446 break;
447 case '\r':
448 if (O_ONOCR(tty) && ldata->column == 0)
449 return 0;
450 if (O_OCRNL(tty)) {
451 c = '\n';
452 if (O_ONLRET(tty))
453 ldata->canon_column = ldata->column = 0;
454 break;
455 }
456 ldata->canon_column = ldata->column = 0;
457 break;
458 case '\t':
459 spaces = 8 - (ldata->column & 7);
460 if (O_TABDLY(tty) == XTABS) {
461 if (space < spaces)
462 return -1;
463 ldata->column += spaces;
464 tty->ops->write(tty, " ", spaces);
465 return spaces;
466 }
467 ldata->column += spaces;
468 break;
469 case '\b':
470 if (ldata->column > 0)
471 ldata->column--;
472 break;
473 default:
474 if (!iscntrl(c)) {
475 if (O_OLCUC(tty))
476 c = toupper(c);
477 if (!is_continuation(c, tty))
478 ldata->column++;
479 }
480 break;
481 }
482
483 tty_put_char(tty, c);
484 return 1;
485}
486
487/**
488 * process_output - output post processor
489 * @c: character (or partial unicode symbol)
490 * @tty: terminal device
491 *
492 * Output one character with OPOST processing.
493 * Returns -1 when the output device is full and the character
494 * must be retried.
495 *
496 * Locking: output_lock to protect column state and space left
497 * (also, this is called from n_tty_write under the
498 * tty layer write lock)
499 */
500
501static int process_output(unsigned char c, struct tty_struct *tty)
502{
503 struct n_tty_data *ldata = tty->disc_data;
504 int space, retval;
505
506 mutex_lock(&ldata->output_lock);
507
508 space = tty_write_room(tty);
509 retval = do_output_char(c, tty, space);
510
511 mutex_unlock(&ldata->output_lock);
512 if (retval < 0)
513 return -1;
514 else
515 return 0;
516}
517
518/**
519 * process_output_block - block post processor
520 * @tty: terminal device
521 * @buf: character buffer
522 * @nr: number of bytes to output
523 *
524 * Output a block of characters with OPOST processing.
525 * Returns the number of characters output.
526 *
527 * This path is used to speed up block console writes, among other
528 * things when processing blocks of output data. It handles only
529 * the simple cases normally found and helps to generate blocks of
530 * symbols for the console driver and thus improve performance.
531 *
532 * Locking: output_lock to protect column state and space left
533 * (also, this is called from n_tty_write under the
534 * tty layer write lock)
535 */
536
537static ssize_t process_output_block(struct tty_struct *tty,
538 const unsigned char *buf, unsigned int nr)
539{
540 struct n_tty_data *ldata = tty->disc_data;
541 int space;
542 int i;
543 const unsigned char *cp;
544
545 mutex_lock(&ldata->output_lock);
546
547 space = tty_write_room(tty);
David Brazdil0f672f62019-12-10 10:32:29 +0000548 if (space <= 0) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000549 mutex_unlock(&ldata->output_lock);
David Brazdil0f672f62019-12-10 10:32:29 +0000550 return space;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000551 }
552 if (nr > space)
553 nr = space;
554
555 for (i = 0, cp = buf; i < nr; i++, cp++) {
556 unsigned char c = *cp;
557
558 switch (c) {
559 case '\n':
560 if (O_ONLRET(tty))
561 ldata->column = 0;
562 if (O_ONLCR(tty))
563 goto break_out;
564 ldata->canon_column = ldata->column;
565 break;
566 case '\r':
567 if (O_ONOCR(tty) && ldata->column == 0)
568 goto break_out;
569 if (O_OCRNL(tty))
570 goto break_out;
571 ldata->canon_column = ldata->column = 0;
572 break;
573 case '\t':
574 goto break_out;
575 case '\b':
576 if (ldata->column > 0)
577 ldata->column--;
578 break;
579 default:
580 if (!iscntrl(c)) {
581 if (O_OLCUC(tty))
582 goto break_out;
583 if (!is_continuation(c, tty))
584 ldata->column++;
585 }
586 break;
587 }
588 }
589break_out:
590 i = tty->ops->write(tty, buf, i);
591
592 mutex_unlock(&ldata->output_lock);
593 return i;
594}
595
596/**
597 * process_echoes - write pending echo characters
598 * @tty: terminal device
599 *
600 * Write previously buffered echo (and other ldisc-generated)
601 * characters to the tty.
602 *
603 * Characters generated by the ldisc (including echoes) need to
604 * be buffered because the driver's write buffer can fill during
605 * heavy program output. Echoing straight to the driver will
606 * often fail under these conditions, causing lost characters and
607 * resulting mismatches of ldisc state information.
608 *
609 * Since the ldisc state must represent the characters actually sent
610 * to the driver at the time of the write, operations like certain
611 * changes in column state are also saved in the buffer and executed
612 * here.
613 *
614 * A circular fifo buffer is used so that the most recent characters
615 * are prioritized. Also, when control characters are echoed with a
616 * prefixed "^", the pair is treated atomically and thus not separated.
617 *
618 * Locking: callers must hold output_lock
619 */
620
621static size_t __process_echoes(struct tty_struct *tty)
622{
623 struct n_tty_data *ldata = tty->disc_data;
624 int space, old_space;
625 size_t tail;
626 unsigned char c;
627
628 old_space = space = tty_write_room(tty);
629
630 tail = ldata->echo_tail;
631 while (MASK(ldata->echo_commit) != MASK(tail)) {
632 c = echo_buf(ldata, tail);
633 if (c == ECHO_OP_START) {
634 unsigned char op;
635 int no_space_left = 0;
636
637 /*
638 * Since add_echo_byte() is called without holding
639 * output_lock, we might see only portion of multi-byte
640 * operation.
641 */
642 if (MASK(ldata->echo_commit) == MASK(tail + 1))
643 goto not_yet_stored;
644 /*
645 * If the buffer byte is the start of a multi-byte
646 * operation, get the next byte, which is either the
647 * op code or a control character value.
648 */
649 op = echo_buf(ldata, tail + 1);
650
651 switch (op) {
Olivier Deprez157378f2022-04-04 15:47:50 +0200652 case ECHO_OP_ERASE_TAB: {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000653 unsigned int num_chars, num_bs;
654
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000655 if (MASK(ldata->echo_commit) == MASK(tail + 2))
656 goto not_yet_stored;
657 num_chars = echo_buf(ldata, tail + 2);
658
659 /*
660 * Determine how many columns to go back
661 * in order to erase the tab.
662 * This depends on the number of columns
663 * used by other characters within the tab
664 * area. If this (modulo 8) count is from
665 * the start of input rather than from a
666 * previous tab, we offset by canon column.
667 * Otherwise, tab spacing is normal.
668 */
669 if (!(num_chars & 0x80))
670 num_chars += ldata->canon_column;
671 num_bs = 8 - (num_chars & 7);
672
673 if (num_bs > space) {
674 no_space_left = 1;
675 break;
676 }
677 space -= num_bs;
678 while (num_bs--) {
679 tty_put_char(tty, '\b');
680 if (ldata->column > 0)
681 ldata->column--;
682 }
683 tail += 3;
684 break;
Olivier Deprez157378f2022-04-04 15:47:50 +0200685 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000686 case ECHO_OP_SET_CANON_COL:
687 ldata->canon_column = ldata->column;
688 tail += 2;
689 break;
690
691 case ECHO_OP_MOVE_BACK_COL:
692 if (ldata->column > 0)
693 ldata->column--;
694 tail += 2;
695 break;
696
697 case ECHO_OP_START:
698 /* This is an escaped echo op start code */
699 if (!space) {
700 no_space_left = 1;
701 break;
702 }
703 tty_put_char(tty, ECHO_OP_START);
704 ldata->column++;
705 space--;
706 tail += 2;
707 break;
708
709 default:
710 /*
711 * If the op is not a special byte code,
712 * it is a ctrl char tagged to be echoed
713 * as "^X" (where X is the letter
714 * representing the control char).
715 * Note that we must ensure there is
716 * enough space for the whole ctrl pair.
717 *
718 */
719 if (space < 2) {
720 no_space_left = 1;
721 break;
722 }
723 tty_put_char(tty, '^');
724 tty_put_char(tty, op ^ 0100);
725 ldata->column += 2;
726 space -= 2;
727 tail += 2;
728 }
729
730 if (no_space_left)
731 break;
732 } else {
733 if (O_OPOST(tty)) {
734 int retval = do_output_char(c, tty, space);
735 if (retval < 0)
736 break;
737 space -= retval;
738 } else {
739 if (!space)
740 break;
741 tty_put_char(tty, c);
742 space -= 1;
743 }
744 tail += 1;
745 }
746 }
747
748 /* If the echo buffer is nearly full (so that the possibility exists
749 * of echo overrun before the next commit), then discard enough
750 * data at the tail to prevent a subsequent overrun */
751 while (ldata->echo_commit > tail &&
752 ldata->echo_commit - tail >= ECHO_DISCARD_WATERMARK) {
753 if (echo_buf(ldata, tail) == ECHO_OP_START) {
754 if (echo_buf(ldata, tail + 1) == ECHO_OP_ERASE_TAB)
755 tail += 3;
756 else
757 tail += 2;
758 } else
759 tail++;
760 }
761
762 not_yet_stored:
763 ldata->echo_tail = tail;
764 return old_space - space;
765}
766
767static void commit_echoes(struct tty_struct *tty)
768{
769 struct n_tty_data *ldata = tty->disc_data;
770 size_t nr, old, echoed;
771 size_t head;
772
773 mutex_lock(&ldata->output_lock);
774 head = ldata->echo_head;
775 ldata->echo_mark = head;
776 old = ldata->echo_commit - ldata->echo_tail;
777
778 /* Process committed echoes if the accumulated # of bytes
779 * is over the threshold (and try again each time another
780 * block is accumulated) */
781 nr = head - ldata->echo_tail;
782 if (nr < ECHO_COMMIT_WATERMARK ||
783 (nr % ECHO_BLOCK > old % ECHO_BLOCK)) {
784 mutex_unlock(&ldata->output_lock);
785 return;
786 }
787
788 ldata->echo_commit = head;
789 echoed = __process_echoes(tty);
790 mutex_unlock(&ldata->output_lock);
791
792 if (echoed && tty->ops->flush_chars)
793 tty->ops->flush_chars(tty);
794}
795
796static void process_echoes(struct tty_struct *tty)
797{
798 struct n_tty_data *ldata = tty->disc_data;
799 size_t echoed;
800
801 if (ldata->echo_mark == ldata->echo_tail)
802 return;
803
804 mutex_lock(&ldata->output_lock);
805 ldata->echo_commit = ldata->echo_mark;
806 echoed = __process_echoes(tty);
807 mutex_unlock(&ldata->output_lock);
808
809 if (echoed && tty->ops->flush_chars)
810 tty->ops->flush_chars(tty);
811}
812
813/* NB: echo_mark and echo_head should be equivalent here */
814static void flush_echoes(struct tty_struct *tty)
815{
816 struct n_tty_data *ldata = tty->disc_data;
817
818 if ((!L_ECHO(tty) && !L_ECHONL(tty)) ||
819 ldata->echo_commit == ldata->echo_head)
820 return;
821
822 mutex_lock(&ldata->output_lock);
823 ldata->echo_commit = ldata->echo_head;
824 __process_echoes(tty);
825 mutex_unlock(&ldata->output_lock);
826}
827
828/**
829 * add_echo_byte - add a byte to the echo buffer
830 * @c: unicode byte to echo
831 * @ldata: n_tty data
832 *
833 * Add a character or operation byte to the echo buffer.
834 */
835
836static inline void add_echo_byte(unsigned char c, struct n_tty_data *ldata)
837{
838 *echo_buf_addr(ldata, ldata->echo_head) = c;
839 smp_wmb(); /* Matches smp_rmb() in echo_buf(). */
840 ldata->echo_head++;
841}
842
843/**
844 * echo_move_back_col - add operation to move back a column
845 * @ldata: n_tty data
846 *
847 * Add an operation to the echo buffer to move back one column.
848 */
849
850static void echo_move_back_col(struct n_tty_data *ldata)
851{
852 add_echo_byte(ECHO_OP_START, ldata);
853 add_echo_byte(ECHO_OP_MOVE_BACK_COL, ldata);
854}
855
856/**
857 * echo_set_canon_col - add operation to set the canon column
858 * @ldata: n_tty data
859 *
860 * Add an operation to the echo buffer to set the canon column
861 * to the current column.
862 */
863
864static void echo_set_canon_col(struct n_tty_data *ldata)
865{
866 add_echo_byte(ECHO_OP_START, ldata);
867 add_echo_byte(ECHO_OP_SET_CANON_COL, ldata);
868}
869
870/**
871 * echo_erase_tab - add operation to erase a tab
872 * @num_chars: number of character columns already used
873 * @after_tab: true if num_chars starts after a previous tab
874 * @ldata: n_tty data
875 *
876 * Add an operation to the echo buffer to erase a tab.
877 *
878 * Called by the eraser function, which knows how many character
879 * columns have been used since either a previous tab or the start
880 * of input. This information will be used later, along with
881 * canon column (if applicable), to go back the correct number
882 * of columns.
883 */
884
885static void echo_erase_tab(unsigned int num_chars, int after_tab,
886 struct n_tty_data *ldata)
887{
888 add_echo_byte(ECHO_OP_START, ldata);
889 add_echo_byte(ECHO_OP_ERASE_TAB, ldata);
890
891 /* We only need to know this modulo 8 (tab spacing) */
892 num_chars &= 7;
893
894 /* Set the high bit as a flag if num_chars is after a previous tab */
895 if (after_tab)
896 num_chars |= 0x80;
897
898 add_echo_byte(num_chars, ldata);
899}
900
901/**
902 * echo_char_raw - echo a character raw
903 * @c: unicode byte to echo
Olivier Deprez157378f2022-04-04 15:47:50 +0200904 * @ldata: line disc data
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000905 *
906 * Echo user input back onto the screen. This must be called only when
907 * L_ECHO(tty) is true. Called from the driver receive_buf path.
908 *
909 * This variant does not treat control characters specially.
910 */
911
912static void echo_char_raw(unsigned char c, struct n_tty_data *ldata)
913{
914 if (c == ECHO_OP_START) {
915 add_echo_byte(ECHO_OP_START, ldata);
916 add_echo_byte(ECHO_OP_START, ldata);
917 } else {
918 add_echo_byte(c, ldata);
919 }
920}
921
922/**
923 * echo_char - echo a character
924 * @c: unicode byte to echo
925 * @tty: terminal device
926 *
927 * Echo user input back onto the screen. This must be called only when
928 * L_ECHO(tty) is true. Called from the driver receive_buf path.
929 *
930 * This variant tags control characters to be echoed as "^X"
931 * (where X is the letter representing the control char).
932 */
933
934static void echo_char(unsigned char c, struct tty_struct *tty)
935{
936 struct n_tty_data *ldata = tty->disc_data;
937
938 if (c == ECHO_OP_START) {
939 add_echo_byte(ECHO_OP_START, ldata);
940 add_echo_byte(ECHO_OP_START, ldata);
941 } else {
942 if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
943 add_echo_byte(ECHO_OP_START, ldata);
944 add_echo_byte(c, ldata);
945 }
946}
947
948/**
949 * finish_erasing - complete erase
950 * @ldata: n_tty data
951 */
952
953static inline void finish_erasing(struct n_tty_data *ldata)
954{
955 if (ldata->erasing) {
956 echo_char_raw('/', ldata);
957 ldata->erasing = 0;
958 }
959}
960
961/**
962 * eraser - handle erase function
963 * @c: character input
964 * @tty: terminal device
965 *
966 * Perform erase and necessary output when an erase character is
967 * present in the stream from the driver layer. Handles the complexities
968 * of UTF-8 multibyte symbols.
969 *
970 * n_tty_receive_buf()/producer path:
971 * caller holds non-exclusive termios_rwsem
972 */
973
974static void eraser(unsigned char c, struct tty_struct *tty)
975{
976 struct n_tty_data *ldata = tty->disc_data;
977 enum { ERASE, WERASE, KILL } kill_type;
978 size_t head;
979 size_t cnt;
980 int seen_alnums;
981
982 if (ldata->read_head == ldata->canon_head) {
983 /* process_output('\a', tty); */ /* what do you think? */
984 return;
985 }
986 if (c == ERASE_CHAR(tty))
987 kill_type = ERASE;
988 else if (c == WERASE_CHAR(tty))
989 kill_type = WERASE;
990 else {
991 if (!L_ECHO(tty)) {
992 ldata->read_head = ldata->canon_head;
993 return;
994 }
995 if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
996 ldata->read_head = ldata->canon_head;
997 finish_erasing(ldata);
998 echo_char(KILL_CHAR(tty), tty);
999 /* Add a newline if ECHOK is on and ECHOKE is off. */
1000 if (L_ECHOK(tty))
1001 echo_char_raw('\n', ldata);
1002 return;
1003 }
1004 kill_type = KILL;
1005 }
1006
1007 seen_alnums = 0;
1008 while (MASK(ldata->read_head) != MASK(ldata->canon_head)) {
1009 head = ldata->read_head;
1010
1011 /* erase a single possibly multibyte character */
1012 do {
1013 head--;
1014 c = read_buf(ldata, head);
1015 } while (is_continuation(c, tty) &&
1016 MASK(head) != MASK(ldata->canon_head));
1017
1018 /* do not partially erase */
1019 if (is_continuation(c, tty))
1020 break;
1021
1022 if (kill_type == WERASE) {
1023 /* Equivalent to BSD's ALTWERASE. */
1024 if (isalnum(c) || c == '_')
1025 seen_alnums++;
1026 else if (seen_alnums)
1027 break;
1028 }
1029 cnt = ldata->read_head - head;
1030 ldata->read_head = head;
1031 if (L_ECHO(tty)) {
1032 if (L_ECHOPRT(tty)) {
1033 if (!ldata->erasing) {
1034 echo_char_raw('\\', ldata);
1035 ldata->erasing = 1;
1036 }
1037 /* if cnt > 1, output a multi-byte character */
1038 echo_char(c, tty);
1039 while (--cnt > 0) {
1040 head++;
1041 echo_char_raw(read_buf(ldata, head), ldata);
1042 echo_move_back_col(ldata);
1043 }
1044 } else if (kill_type == ERASE && !L_ECHOE(tty)) {
1045 echo_char(ERASE_CHAR(tty), tty);
1046 } else if (c == '\t') {
1047 unsigned int num_chars = 0;
1048 int after_tab = 0;
1049 size_t tail = ldata->read_head;
1050
1051 /*
1052 * Count the columns used for characters
1053 * since the start of input or after a
1054 * previous tab.
1055 * This info is used to go back the correct
1056 * number of columns.
1057 */
1058 while (MASK(tail) != MASK(ldata->canon_head)) {
1059 tail--;
1060 c = read_buf(ldata, tail);
1061 if (c == '\t') {
1062 after_tab = 1;
1063 break;
1064 } else if (iscntrl(c)) {
1065 if (L_ECHOCTL(tty))
1066 num_chars += 2;
1067 } else if (!is_continuation(c, tty)) {
1068 num_chars++;
1069 }
1070 }
1071 echo_erase_tab(num_chars, after_tab, ldata);
1072 } else {
1073 if (iscntrl(c) && L_ECHOCTL(tty)) {
1074 echo_char_raw('\b', ldata);
1075 echo_char_raw(' ', ldata);
1076 echo_char_raw('\b', ldata);
1077 }
1078 if (!iscntrl(c) || L_ECHOCTL(tty)) {
1079 echo_char_raw('\b', ldata);
1080 echo_char_raw(' ', ldata);
1081 echo_char_raw('\b', ldata);
1082 }
1083 }
1084 }
1085 if (kill_type == ERASE)
1086 break;
1087 }
1088 if (ldata->read_head == ldata->canon_head && L_ECHO(tty))
1089 finish_erasing(ldata);
1090}
1091
1092/**
1093 * isig - handle the ISIG optio
1094 * @sig: signal
1095 * @tty: terminal
1096 *
1097 * Called when a signal is being sent due to terminal input.
1098 * Called from the driver receive_buf path so serialized.
1099 *
1100 * Performs input and output flush if !NOFLSH. In this context, the echo
1101 * buffer is 'output'. The signal is processed first to alert any current
1102 * readers or writers to discontinue and exit their i/o loops.
1103 *
1104 * Locking: ctrl_lock
1105 */
1106
1107static void __isig(int sig, struct tty_struct *tty)
1108{
1109 struct pid *tty_pgrp = tty_get_pgrp(tty);
1110 if (tty_pgrp) {
1111 kill_pgrp(tty_pgrp, sig, 1);
1112 put_pid(tty_pgrp);
1113 }
1114}
1115
1116static void isig(int sig, struct tty_struct *tty)
1117{
1118 struct n_tty_data *ldata = tty->disc_data;
1119
1120 if (L_NOFLSH(tty)) {
1121 /* signal only */
1122 __isig(sig, tty);
1123
1124 } else { /* signal and flush */
1125 up_read(&tty->termios_rwsem);
1126 down_write(&tty->termios_rwsem);
1127
1128 __isig(sig, tty);
1129
1130 /* clear echo buffer */
1131 mutex_lock(&ldata->output_lock);
1132 ldata->echo_head = ldata->echo_tail = 0;
1133 ldata->echo_mark = ldata->echo_commit = 0;
1134 mutex_unlock(&ldata->output_lock);
1135
1136 /* clear output buffer */
1137 tty_driver_flush_buffer(tty);
1138
1139 /* clear input buffer */
1140 reset_buffer_flags(tty->disc_data);
1141
1142 /* notify pty master of flush */
1143 if (tty->link)
1144 n_tty_packet_mode_flush(tty);
1145
1146 up_write(&tty->termios_rwsem);
1147 down_read(&tty->termios_rwsem);
1148 }
1149}
1150
1151/**
1152 * n_tty_receive_break - handle break
1153 * @tty: terminal
1154 *
1155 * An RS232 break event has been hit in the incoming bitstream. This
1156 * can cause a variety of events depending upon the termios settings.
1157 *
1158 * n_tty_receive_buf()/producer path:
1159 * caller holds non-exclusive termios_rwsem
1160 *
1161 * Note: may get exclusive termios_rwsem if flushing input buffer
1162 */
1163
1164static void n_tty_receive_break(struct tty_struct *tty)
1165{
1166 struct n_tty_data *ldata = tty->disc_data;
1167
1168 if (I_IGNBRK(tty))
1169 return;
1170 if (I_BRKINT(tty)) {
1171 isig(SIGINT, tty);
1172 return;
1173 }
1174 if (I_PARMRK(tty)) {
1175 put_tty_queue('\377', ldata);
1176 put_tty_queue('\0', ldata);
1177 }
1178 put_tty_queue('\0', ldata);
1179}
1180
1181/**
1182 * n_tty_receive_overrun - handle overrun reporting
1183 * @tty: terminal
1184 *
1185 * Data arrived faster than we could process it. While the tty
1186 * driver has flagged this the bits that were missed are gone
1187 * forever.
1188 *
1189 * Called from the receive_buf path so single threaded. Does not
1190 * need locking as num_overrun and overrun_time are function
1191 * private.
1192 */
1193
1194static void n_tty_receive_overrun(struct tty_struct *tty)
1195{
1196 struct n_tty_data *ldata = tty->disc_data;
1197
1198 ldata->num_overrun++;
1199 if (time_after(jiffies, ldata->overrun_time + HZ) ||
1200 time_after(ldata->overrun_time, jiffies)) {
1201 tty_warn(tty, "%d input overrun(s)\n", ldata->num_overrun);
1202 ldata->overrun_time = jiffies;
1203 ldata->num_overrun = 0;
1204 }
1205}
1206
1207/**
1208 * n_tty_receive_parity_error - error notifier
1209 * @tty: terminal device
1210 * @c: character
1211 *
1212 * Process a parity error and queue the right data to indicate
1213 * the error case if necessary.
1214 *
1215 * n_tty_receive_buf()/producer path:
1216 * caller holds non-exclusive termios_rwsem
1217 */
1218static void n_tty_receive_parity_error(struct tty_struct *tty, unsigned char c)
1219{
1220 struct n_tty_data *ldata = tty->disc_data;
1221
1222 if (I_INPCK(tty)) {
1223 if (I_IGNPAR(tty))
1224 return;
1225 if (I_PARMRK(tty)) {
1226 put_tty_queue('\377', ldata);
1227 put_tty_queue('\0', ldata);
1228 put_tty_queue(c, ldata);
1229 } else
1230 put_tty_queue('\0', ldata);
1231 } else
1232 put_tty_queue(c, ldata);
1233}
1234
1235static void
1236n_tty_receive_signal_char(struct tty_struct *tty, int signal, unsigned char c)
1237{
1238 isig(signal, tty);
1239 if (I_IXON(tty))
1240 start_tty(tty);
1241 if (L_ECHO(tty)) {
1242 echo_char(c, tty);
1243 commit_echoes(tty);
1244 } else
1245 process_echoes(tty);
1246 return;
1247}
1248
1249/**
1250 * n_tty_receive_char - perform processing
1251 * @tty: terminal device
1252 * @c: character
1253 *
1254 * Process an individual character of input received from the driver.
1255 * This is serialized with respect to itself by the rules for the
1256 * driver above.
1257 *
1258 * n_tty_receive_buf()/producer path:
1259 * caller holds non-exclusive termios_rwsem
1260 * publishes canon_head if canonical mode is active
1261 *
1262 * Returns 1 if LNEXT was received, else returns 0
1263 */
1264
1265static int
1266n_tty_receive_char_special(struct tty_struct *tty, unsigned char c)
1267{
1268 struct n_tty_data *ldata = tty->disc_data;
1269
1270 if (I_IXON(tty)) {
1271 if (c == START_CHAR(tty)) {
1272 start_tty(tty);
1273 process_echoes(tty);
1274 return 0;
1275 }
1276 if (c == STOP_CHAR(tty)) {
1277 stop_tty(tty);
1278 return 0;
1279 }
1280 }
1281
1282 if (L_ISIG(tty)) {
1283 if (c == INTR_CHAR(tty)) {
1284 n_tty_receive_signal_char(tty, SIGINT, c);
1285 return 0;
1286 } else if (c == QUIT_CHAR(tty)) {
1287 n_tty_receive_signal_char(tty, SIGQUIT, c);
1288 return 0;
1289 } else if (c == SUSP_CHAR(tty)) {
1290 n_tty_receive_signal_char(tty, SIGTSTP, c);
1291 return 0;
1292 }
1293 }
1294
1295 if (tty->stopped && !tty->flow_stopped && I_IXON(tty) && I_IXANY(tty)) {
1296 start_tty(tty);
1297 process_echoes(tty);
1298 }
1299
1300 if (c == '\r') {
1301 if (I_IGNCR(tty))
1302 return 0;
1303 if (I_ICRNL(tty))
1304 c = '\n';
1305 } else if (c == '\n' && I_INLCR(tty))
1306 c = '\r';
1307
1308 if (ldata->icanon) {
1309 if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
1310 (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
1311 eraser(c, tty);
1312 commit_echoes(tty);
1313 return 0;
1314 }
1315 if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
1316 ldata->lnext = 1;
1317 if (L_ECHO(tty)) {
1318 finish_erasing(ldata);
1319 if (L_ECHOCTL(tty)) {
1320 echo_char_raw('^', ldata);
1321 echo_char_raw('\b', ldata);
1322 commit_echoes(tty);
1323 }
1324 }
1325 return 1;
1326 }
1327 if (c == REPRINT_CHAR(tty) && L_ECHO(tty) && L_IEXTEN(tty)) {
1328 size_t tail = ldata->canon_head;
1329
1330 finish_erasing(ldata);
1331 echo_char(c, tty);
1332 echo_char_raw('\n', ldata);
1333 while (MASK(tail) != MASK(ldata->read_head)) {
1334 echo_char(read_buf(ldata, tail), tty);
1335 tail++;
1336 }
1337 commit_echoes(tty);
1338 return 0;
1339 }
1340 if (c == '\n') {
1341 if (L_ECHO(tty) || L_ECHONL(tty)) {
1342 echo_char_raw('\n', ldata);
1343 commit_echoes(tty);
1344 }
1345 goto handle_newline;
1346 }
1347 if (c == EOF_CHAR(tty)) {
1348 c = __DISABLED_CHAR;
1349 goto handle_newline;
1350 }
1351 if ((c == EOL_CHAR(tty)) ||
1352 (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
1353 /*
1354 * XXX are EOL_CHAR and EOL2_CHAR echoed?!?
1355 */
1356 if (L_ECHO(tty)) {
1357 /* Record the column of first canon char. */
1358 if (ldata->canon_head == ldata->read_head)
1359 echo_set_canon_col(ldata);
1360 echo_char(c, tty);
1361 commit_echoes(tty);
1362 }
1363 /*
1364 * XXX does PARMRK doubling happen for
1365 * EOL_CHAR and EOL2_CHAR?
1366 */
1367 if (c == (unsigned char) '\377' && I_PARMRK(tty))
1368 put_tty_queue(c, ldata);
1369
1370handle_newline:
1371 set_bit(ldata->read_head & (N_TTY_BUF_SIZE - 1), ldata->read_flags);
1372 put_tty_queue(c, ldata);
1373 smp_store_release(&ldata->canon_head, ldata->read_head);
1374 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
Olivier Deprez157378f2022-04-04 15:47:50 +02001375 wake_up_interruptible_poll(&tty->read_wait, EPOLLIN | EPOLLRDNORM);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001376 return 0;
1377 }
1378 }
1379
1380 if (L_ECHO(tty)) {
1381 finish_erasing(ldata);
1382 if (c == '\n')
1383 echo_char_raw('\n', ldata);
1384 else {
1385 /* Record the column of first canon char. */
1386 if (ldata->canon_head == ldata->read_head)
1387 echo_set_canon_col(ldata);
1388 echo_char(c, tty);
1389 }
1390 commit_echoes(tty);
1391 }
1392
1393 /* PARMRK doubling check */
1394 if (c == (unsigned char) '\377' && I_PARMRK(tty))
1395 put_tty_queue(c, ldata);
1396
1397 put_tty_queue(c, ldata);
1398 return 0;
1399}
1400
1401static inline void
1402n_tty_receive_char_inline(struct tty_struct *tty, unsigned char c)
1403{
1404 struct n_tty_data *ldata = tty->disc_data;
1405
1406 if (tty->stopped && !tty->flow_stopped && I_IXON(tty) && I_IXANY(tty)) {
1407 start_tty(tty);
1408 process_echoes(tty);
1409 }
1410 if (L_ECHO(tty)) {
1411 finish_erasing(ldata);
1412 /* Record the column of first canon char. */
1413 if (ldata->canon_head == ldata->read_head)
1414 echo_set_canon_col(ldata);
1415 echo_char(c, tty);
1416 commit_echoes(tty);
1417 }
1418 /* PARMRK doubling check */
1419 if (c == (unsigned char) '\377' && I_PARMRK(tty))
1420 put_tty_queue(c, ldata);
1421 put_tty_queue(c, ldata);
1422}
1423
1424static void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
1425{
1426 n_tty_receive_char_inline(tty, c);
1427}
1428
1429static inline void
1430n_tty_receive_char_fast(struct tty_struct *tty, unsigned char c)
1431{
1432 struct n_tty_data *ldata = tty->disc_data;
1433
1434 if (tty->stopped && !tty->flow_stopped && I_IXON(tty) && I_IXANY(tty)) {
1435 start_tty(tty);
1436 process_echoes(tty);
1437 }
1438 if (L_ECHO(tty)) {
1439 finish_erasing(ldata);
1440 /* Record the column of first canon char. */
1441 if (ldata->canon_head == ldata->read_head)
1442 echo_set_canon_col(ldata);
1443 echo_char(c, tty);
1444 commit_echoes(tty);
1445 }
1446 put_tty_queue(c, ldata);
1447}
1448
1449static void n_tty_receive_char_closing(struct tty_struct *tty, unsigned char c)
1450{
1451 if (I_ISTRIP(tty))
1452 c &= 0x7f;
1453 if (I_IUCLC(tty) && L_IEXTEN(tty))
1454 c = tolower(c);
1455
1456 if (I_IXON(tty)) {
1457 if (c == STOP_CHAR(tty))
1458 stop_tty(tty);
1459 else if (c == START_CHAR(tty) ||
1460 (tty->stopped && !tty->flow_stopped && I_IXANY(tty) &&
1461 c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) &&
1462 c != SUSP_CHAR(tty))) {
1463 start_tty(tty);
1464 process_echoes(tty);
1465 }
1466 }
1467}
1468
1469static void
1470n_tty_receive_char_flagged(struct tty_struct *tty, unsigned char c, char flag)
1471{
1472 switch (flag) {
1473 case TTY_BREAK:
1474 n_tty_receive_break(tty);
1475 break;
1476 case TTY_PARITY:
1477 case TTY_FRAME:
1478 n_tty_receive_parity_error(tty, c);
1479 break;
1480 case TTY_OVERRUN:
1481 n_tty_receive_overrun(tty);
1482 break;
1483 default:
1484 tty_err(tty, "unknown flag %d\n", flag);
1485 break;
1486 }
1487}
1488
1489static void
1490n_tty_receive_char_lnext(struct tty_struct *tty, unsigned char c, char flag)
1491{
1492 struct n_tty_data *ldata = tty->disc_data;
1493
1494 ldata->lnext = 0;
1495 if (likely(flag == TTY_NORMAL)) {
1496 if (I_ISTRIP(tty))
1497 c &= 0x7f;
1498 if (I_IUCLC(tty) && L_IEXTEN(tty))
1499 c = tolower(c);
1500 n_tty_receive_char(tty, c);
1501 } else
1502 n_tty_receive_char_flagged(tty, c, flag);
1503}
1504
1505static void
1506n_tty_receive_buf_real_raw(struct tty_struct *tty, const unsigned char *cp,
1507 char *fp, int count)
1508{
1509 struct n_tty_data *ldata = tty->disc_data;
1510 size_t n, head;
1511
1512 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1513 n = min_t(size_t, count, N_TTY_BUF_SIZE - head);
1514 memcpy(read_buf_addr(ldata, head), cp, n);
1515 ldata->read_head += n;
1516 cp += n;
1517 count -= n;
1518
1519 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1520 n = min_t(size_t, count, N_TTY_BUF_SIZE - head);
1521 memcpy(read_buf_addr(ldata, head), cp, n);
1522 ldata->read_head += n;
1523}
1524
1525static void
1526n_tty_receive_buf_raw(struct tty_struct *tty, const unsigned char *cp,
1527 char *fp, int count)
1528{
1529 struct n_tty_data *ldata = tty->disc_data;
1530 char flag = TTY_NORMAL;
1531
1532 while (count--) {
1533 if (fp)
1534 flag = *fp++;
1535 if (likely(flag == TTY_NORMAL))
1536 put_tty_queue(*cp++, ldata);
1537 else
1538 n_tty_receive_char_flagged(tty, *cp++, flag);
1539 }
1540}
1541
1542static void
1543n_tty_receive_buf_closing(struct tty_struct *tty, const unsigned char *cp,
1544 char *fp, int count)
1545{
1546 char flag = TTY_NORMAL;
1547
1548 while (count--) {
1549 if (fp)
1550 flag = *fp++;
1551 if (likely(flag == TTY_NORMAL))
1552 n_tty_receive_char_closing(tty, *cp++);
1553 }
1554}
1555
1556static void
1557n_tty_receive_buf_standard(struct tty_struct *tty, const unsigned char *cp,
1558 char *fp, int count)
1559{
1560 struct n_tty_data *ldata = tty->disc_data;
1561 char flag = TTY_NORMAL;
1562
1563 while (count--) {
1564 if (fp)
1565 flag = *fp++;
1566 if (likely(flag == TTY_NORMAL)) {
1567 unsigned char c = *cp++;
1568
1569 if (I_ISTRIP(tty))
1570 c &= 0x7f;
1571 if (I_IUCLC(tty) && L_IEXTEN(tty))
1572 c = tolower(c);
1573 if (L_EXTPROC(tty)) {
1574 put_tty_queue(c, ldata);
1575 continue;
1576 }
1577 if (!test_bit(c, ldata->char_map))
1578 n_tty_receive_char_inline(tty, c);
1579 else if (n_tty_receive_char_special(tty, c) && count) {
1580 if (fp)
1581 flag = *fp++;
1582 n_tty_receive_char_lnext(tty, *cp++, flag);
1583 count--;
1584 }
1585 } else
1586 n_tty_receive_char_flagged(tty, *cp++, flag);
1587 }
1588}
1589
1590static void
1591n_tty_receive_buf_fast(struct tty_struct *tty, const unsigned char *cp,
1592 char *fp, int count)
1593{
1594 struct n_tty_data *ldata = tty->disc_data;
1595 char flag = TTY_NORMAL;
1596
1597 while (count--) {
1598 if (fp)
1599 flag = *fp++;
1600 if (likely(flag == TTY_NORMAL)) {
1601 unsigned char c = *cp++;
1602
1603 if (!test_bit(c, ldata->char_map))
1604 n_tty_receive_char_fast(tty, c);
1605 else if (n_tty_receive_char_special(tty, c) && count) {
1606 if (fp)
1607 flag = *fp++;
1608 n_tty_receive_char_lnext(tty, *cp++, flag);
1609 count--;
1610 }
1611 } else
1612 n_tty_receive_char_flagged(tty, *cp++, flag);
1613 }
1614}
1615
1616static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
1617 char *fp, int count)
1618{
1619 struct n_tty_data *ldata = tty->disc_data;
1620 bool preops = I_ISTRIP(tty) || (I_IUCLC(tty) && L_IEXTEN(tty));
1621
1622 if (ldata->real_raw)
1623 n_tty_receive_buf_real_raw(tty, cp, fp, count);
1624 else if (ldata->raw || (L_EXTPROC(tty) && !preops))
1625 n_tty_receive_buf_raw(tty, cp, fp, count);
1626 else if (tty->closing && !L_EXTPROC(tty))
1627 n_tty_receive_buf_closing(tty, cp, fp, count);
1628 else {
1629 if (ldata->lnext) {
1630 char flag = TTY_NORMAL;
1631
1632 if (fp)
1633 flag = *fp++;
1634 n_tty_receive_char_lnext(tty, *cp++, flag);
1635 count--;
1636 }
1637
1638 if (!preops && !I_PARMRK(tty))
1639 n_tty_receive_buf_fast(tty, cp, fp, count);
1640 else
1641 n_tty_receive_buf_standard(tty, cp, fp, count);
1642
1643 flush_echoes(tty);
1644 if (tty->ops->flush_chars)
1645 tty->ops->flush_chars(tty);
1646 }
1647
1648 if (ldata->icanon && !L_EXTPROC(tty))
1649 return;
1650
1651 /* publish read_head to consumer */
1652 smp_store_release(&ldata->commit_head, ldata->read_head);
1653
1654 if (read_cnt(ldata)) {
1655 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
Olivier Deprez157378f2022-04-04 15:47:50 +02001656 wake_up_interruptible_poll(&tty->read_wait, EPOLLIN | EPOLLRDNORM);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001657 }
1658}
1659
1660/**
1661 * n_tty_receive_buf_common - process input
1662 * @tty: device to receive input
1663 * @cp: input chars
1664 * @fp: flags for each char (if NULL, all chars are TTY_NORMAL)
1665 * @count: number of input chars in @cp
1666 *
1667 * Called by the terminal driver when a block of characters has
1668 * been received. This function must be called from soft contexts
1669 * not from interrupt context. The driver is responsible for making
1670 * calls one at a time and in order (or using flush_to_ldisc)
1671 *
1672 * Returns the # of input chars from @cp which were processed.
1673 *
1674 * In canonical mode, the maximum line length is 4096 chars (including
1675 * the line termination char); lines longer than 4096 chars are
1676 * truncated. After 4095 chars, input data is still processed but
1677 * not stored. Overflow processing ensures the tty can always
1678 * receive more input until at least one line can be read.
1679 *
1680 * In non-canonical mode, the read buffer will only accept 4095 chars;
1681 * this provides the necessary space for a newline char if the input
1682 * mode is switched to canonical.
1683 *
1684 * Note it is possible for the read buffer to _contain_ 4096 chars
1685 * in non-canonical mode: the read buffer could already contain the
1686 * maximum canon line of 4096 chars when the mode is switched to
1687 * non-canonical.
1688 *
1689 * n_tty_receive_buf()/producer path:
1690 * claims non-exclusive termios_rwsem
1691 * publishes commit_head or canon_head
1692 */
1693static int
1694n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp,
1695 char *fp, int count, int flow)
1696{
1697 struct n_tty_data *ldata = tty->disc_data;
1698 int room, n, rcvd = 0, overflow;
1699
1700 down_read(&tty->termios_rwsem);
1701
David Brazdil0f672f62019-12-10 10:32:29 +00001702 do {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001703 /*
1704 * When PARMRK is set, each input char may take up to 3 chars
1705 * in the read buf; reduce the buffer space avail by 3x
1706 *
1707 * If we are doing input canonicalization, and there are no
1708 * pending newlines, let characters through without limit, so
1709 * that erase characters will be handled. Other excess
1710 * characters will be beeped.
1711 *
1712 * paired with store in *_copy_from_read_buf() -- guarantees
1713 * the consumer has loaded the data in read_buf up to the new
1714 * read_tail (so this producer will not overwrite unread data)
1715 */
1716 size_t tail = smp_load_acquire(&ldata->read_tail);
1717
1718 room = N_TTY_BUF_SIZE - (ldata->read_head - tail);
1719 if (I_PARMRK(tty))
1720 room = (room + 2) / 3;
1721 room--;
1722 if (room <= 0) {
1723 overflow = ldata->icanon && ldata->canon_head == tail;
1724 if (overflow && room < 0)
1725 ldata->read_head--;
1726 room = overflow;
1727 ldata->no_room = flow && !room;
1728 } else
1729 overflow = 0;
1730
1731 n = min(count, room);
1732 if (!n)
1733 break;
1734
1735 /* ignore parity errors if handling overflow */
1736 if (!overflow || !fp || *fp != TTY_PARITY)
1737 __receive_buf(tty, cp, fp, n);
1738
1739 cp += n;
1740 if (fp)
1741 fp += n;
1742 count -= n;
1743 rcvd += n;
David Brazdil0f672f62019-12-10 10:32:29 +00001744 } while (!test_bit(TTY_LDISC_CHANGING, &tty->flags));
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001745
1746 tty->receive_room = room;
1747
1748 /* Unthrottle if handling overflow on pty */
1749 if (tty->driver->type == TTY_DRIVER_TYPE_PTY) {
1750 if (overflow) {
1751 tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);
1752 tty_unthrottle_safe(tty);
1753 __tty_set_flow_change(tty, 0);
1754 }
1755 } else
1756 n_tty_check_throttle(tty);
1757
1758 up_read(&tty->termios_rwsem);
1759
1760 return rcvd;
1761}
1762
1763static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
1764 char *fp, int count)
1765{
1766 n_tty_receive_buf_common(tty, cp, fp, count, 0);
1767}
1768
1769static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
1770 char *fp, int count)
1771{
1772 return n_tty_receive_buf_common(tty, cp, fp, count, 1);
1773}
1774
1775/**
1776 * n_tty_set_termios - termios data changed
1777 * @tty: terminal
1778 * @old: previous data
1779 *
1780 * Called by the tty layer when the user changes termios flags so
1781 * that the line discipline can plan ahead. This function cannot sleep
1782 * and is protected from re-entry by the tty layer. The user is
1783 * guaranteed that this function will not be re-entered or in progress
1784 * when the ldisc is closed.
1785 *
1786 * Locking: Caller holds tty->termios_rwsem
1787 */
1788
1789static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
1790{
1791 struct n_tty_data *ldata = tty->disc_data;
1792
1793 if (!old || (old->c_lflag ^ tty->termios.c_lflag) & (ICANON | EXTPROC)) {
1794 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
1795 ldata->line_start = ldata->read_tail;
1796 if (!L_ICANON(tty) || !read_cnt(ldata)) {
1797 ldata->canon_head = ldata->read_tail;
1798 ldata->push = 0;
1799 } else {
1800 set_bit((ldata->read_head - 1) & (N_TTY_BUF_SIZE - 1),
1801 ldata->read_flags);
1802 ldata->canon_head = ldata->read_head;
1803 ldata->push = 1;
1804 }
1805 ldata->commit_head = ldata->read_head;
1806 ldata->erasing = 0;
1807 ldata->lnext = 0;
1808 }
1809
1810 ldata->icanon = (L_ICANON(tty) != 0);
1811
1812 if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
1813 I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
1814 I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
1815 I_PARMRK(tty)) {
1816 bitmap_zero(ldata->char_map, 256);
1817
1818 if (I_IGNCR(tty) || I_ICRNL(tty))
1819 set_bit('\r', ldata->char_map);
1820 if (I_INLCR(tty))
1821 set_bit('\n', ldata->char_map);
1822
1823 if (L_ICANON(tty)) {
1824 set_bit(ERASE_CHAR(tty), ldata->char_map);
1825 set_bit(KILL_CHAR(tty), ldata->char_map);
1826 set_bit(EOF_CHAR(tty), ldata->char_map);
1827 set_bit('\n', ldata->char_map);
1828 set_bit(EOL_CHAR(tty), ldata->char_map);
1829 if (L_IEXTEN(tty)) {
1830 set_bit(WERASE_CHAR(tty), ldata->char_map);
1831 set_bit(LNEXT_CHAR(tty), ldata->char_map);
1832 set_bit(EOL2_CHAR(tty), ldata->char_map);
1833 if (L_ECHO(tty))
1834 set_bit(REPRINT_CHAR(tty),
1835 ldata->char_map);
1836 }
1837 }
1838 if (I_IXON(tty)) {
1839 set_bit(START_CHAR(tty), ldata->char_map);
1840 set_bit(STOP_CHAR(tty), ldata->char_map);
1841 }
1842 if (L_ISIG(tty)) {
1843 set_bit(INTR_CHAR(tty), ldata->char_map);
1844 set_bit(QUIT_CHAR(tty), ldata->char_map);
1845 set_bit(SUSP_CHAR(tty), ldata->char_map);
1846 }
1847 clear_bit(__DISABLED_CHAR, ldata->char_map);
1848 ldata->raw = 0;
1849 ldata->real_raw = 0;
1850 } else {
1851 ldata->raw = 1;
1852 if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
1853 (I_IGNPAR(tty) || !I_INPCK(tty)) &&
1854 (tty->driver->flags & TTY_DRIVER_REAL_RAW))
1855 ldata->real_raw = 1;
1856 else
1857 ldata->real_raw = 0;
1858 }
1859 /*
1860 * Fix tty hang when I_IXON(tty) is cleared, but the tty
1861 * been stopped by STOP_CHAR(tty) before it.
1862 */
1863 if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
1864 start_tty(tty);
1865 process_echoes(tty);
1866 }
1867
1868 /* The termios change make the tty ready for I/O */
1869 wake_up_interruptible(&tty->write_wait);
1870 wake_up_interruptible(&tty->read_wait);
1871}
1872
1873/**
1874 * n_tty_close - close the ldisc for this tty
1875 * @tty: device
1876 *
1877 * Called from the terminal layer when this line discipline is
1878 * being shut down, either because of a close or becsuse of a
1879 * discipline change. The function will not be called while other
1880 * ldisc methods are in progress.
1881 */
1882
1883static void n_tty_close(struct tty_struct *tty)
1884{
1885 struct n_tty_data *ldata = tty->disc_data;
1886
1887 if (tty->link)
1888 n_tty_packet_mode_flush(tty);
1889
1890 vfree(ldata);
1891 tty->disc_data = NULL;
1892}
1893
1894/**
1895 * n_tty_open - open an ldisc
1896 * @tty: terminal to open
1897 *
1898 * Called when this line discipline is being attached to the
1899 * terminal device. Can sleep. Called serialized so that no
1900 * other events will occur in parallel. No further open will occur
1901 * until a close.
1902 */
1903
1904static int n_tty_open(struct tty_struct *tty)
1905{
1906 struct n_tty_data *ldata;
1907
1908 /* Currently a malloc failure here can panic */
1909 ldata = vzalloc(sizeof(*ldata));
1910 if (!ldata)
1911 return -ENOMEM;
1912
1913 ldata->overrun_time = jiffies;
1914 mutex_init(&ldata->atomic_read_lock);
1915 mutex_init(&ldata->output_lock);
1916
1917 tty->disc_data = ldata;
1918 tty->closing = 0;
1919 /* indicate buffer work may resume */
1920 clear_bit(TTY_LDISC_HALTED, &tty->flags);
1921 n_tty_set_termios(tty, NULL);
1922 tty_unthrottle(tty);
1923 return 0;
1924}
1925
1926static inline int input_available_p(struct tty_struct *tty, int poll)
1927{
1928 struct n_tty_data *ldata = tty->disc_data;
1929 int amt = poll && !TIME_CHAR(tty) && MIN_CHAR(tty) ? MIN_CHAR(tty) : 1;
1930
1931 if (ldata->icanon && !L_EXTPROC(tty))
1932 return ldata->canon_head != ldata->read_tail;
1933 else
1934 return ldata->commit_head - ldata->read_tail >= amt;
1935}
1936
1937/**
1938 * copy_from_read_buf - copy read data directly
1939 * @tty: terminal device
Olivier Deprez157378f2022-04-04 15:47:50 +02001940 * @kbp: data
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001941 * @nr: size of data
1942 *
1943 * Helper function to speed up n_tty_read. It is only called when
Olivier Deprez157378f2022-04-04 15:47:50 +02001944 * ICANON is off; it copies characters straight from the tty queue.
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001945 *
1946 * Called under the ldata->atomic_read_lock sem
1947 *
Olivier Deprez157378f2022-04-04 15:47:50 +02001948 * Returns true if it successfully copied data, but there is still
1949 * more data to be had.
1950 *
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001951 * n_tty_read()/consumer path:
1952 * caller holds non-exclusive termios_rwsem
1953 * read_tail published
1954 */
1955
Olivier Deprez157378f2022-04-04 15:47:50 +02001956static bool copy_from_read_buf(struct tty_struct *tty,
1957 unsigned char **kbp,
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001958 size_t *nr)
1959
1960{
1961 struct n_tty_data *ldata = tty->disc_data;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001962 size_t n;
1963 bool is_eof;
1964 size_t head = smp_load_acquire(&ldata->commit_head);
1965 size_t tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
1966
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001967 n = min(head - ldata->read_tail, N_TTY_BUF_SIZE - tail);
1968 n = min(*nr, n);
1969 if (n) {
1970 unsigned char *from = read_buf_addr(ldata, tail);
Olivier Deprez157378f2022-04-04 15:47:50 +02001971 memcpy(*kbp, from, n);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001972 is_eof = n == 1 && *from == EOF_CHAR(tty);
1973 tty_audit_add_data(tty, from, n);
1974 zero_buffer(tty, from, n);
1975 smp_store_release(&ldata->read_tail, ldata->read_tail + n);
1976 /* Turn single EOF into zero-length read */
1977 if (L_EXTPROC(tty) && ldata->icanon && is_eof &&
1978 (head == ldata->read_tail))
Olivier Deprez157378f2022-04-04 15:47:50 +02001979 return false;
1980 *kbp += n;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001981 *nr -= n;
Olivier Deprez157378f2022-04-04 15:47:50 +02001982
1983 /* If we have more to copy, let the caller know */
1984 return head != ldata->read_tail;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001985 }
Olivier Deprez157378f2022-04-04 15:47:50 +02001986 return false;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001987}
1988
1989/**
1990 * canon_copy_from_read_buf - copy read data in canonical mode
1991 * @tty: terminal device
Olivier Deprez157378f2022-04-04 15:47:50 +02001992 * @kbp: data
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001993 * @nr: size of data
1994 *
1995 * Helper function for n_tty_read. It is only called when ICANON is on;
1996 * it copies one line of input up to and including the line-delimiting
Olivier Deprez157378f2022-04-04 15:47:50 +02001997 * character into the result buffer.
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001998 *
1999 * NB: When termios is changed from non-canonical to canonical mode and
2000 * the read buffer contains data, n_tty_set_termios() simulates an EOF
2001 * push (as if C-d were input) _without_ the DISABLED_CHAR in the buffer.
2002 * This causes data already processed as input to be immediately available
2003 * as input although a newline has not been received.
2004 *
2005 * Called under the atomic_read_lock mutex
2006 *
2007 * n_tty_read()/consumer path:
2008 * caller holds non-exclusive termios_rwsem
2009 * read_tail published
2010 */
2011
Olivier Deprez157378f2022-04-04 15:47:50 +02002012static bool canon_copy_from_read_buf(struct tty_struct *tty,
2013 unsigned char **kbp,
2014 size_t *nr)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002015{
2016 struct n_tty_data *ldata = tty->disc_data;
2017 size_t n, size, more, c;
2018 size_t eol;
Olivier Deprez157378f2022-04-04 15:47:50 +02002019 size_t tail, canon_head;
2020 int found = 0;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002021
2022 /* N.B. avoid overrun if nr == 0 */
2023 if (!*nr)
Olivier Deprez157378f2022-04-04 15:47:50 +02002024 return false;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002025
Olivier Deprez157378f2022-04-04 15:47:50 +02002026 canon_head = smp_load_acquire(&ldata->canon_head);
2027 n = min(*nr, canon_head - ldata->read_tail);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002028
2029 tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
2030 size = min_t(size_t, tail + n, N_TTY_BUF_SIZE);
2031
2032 n_tty_trace("%s: nr:%zu tail:%zu n:%zu size:%zu\n",
2033 __func__, *nr, tail, n, size);
2034
2035 eol = find_next_bit(ldata->read_flags, size, tail);
2036 more = n - (size - tail);
2037 if (eol == N_TTY_BUF_SIZE && more) {
2038 /* scan wrapped without finding set bit */
2039 eol = find_next_bit(ldata->read_flags, more, 0);
2040 found = eol != more;
2041 } else
2042 found = eol != size;
2043
2044 n = eol - tail;
2045 if (n > N_TTY_BUF_SIZE)
2046 n += N_TTY_BUF_SIZE;
2047 c = n + found;
2048
Olivier Deprez157378f2022-04-04 15:47:50 +02002049 if (!found || read_buf(ldata, eol) != __DISABLED_CHAR)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002050 n = c;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002051
2052 n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu tail:%zu more:%zu\n",
2053 __func__, eol, found, n, c, tail, more);
2054
Olivier Deprez157378f2022-04-04 15:47:50 +02002055 tty_copy(tty, *kbp, tail, n);
2056 *kbp += n;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002057 *nr -= n;
2058
2059 if (found)
2060 clear_bit(eol, ldata->read_flags);
2061 smp_store_release(&ldata->read_tail, ldata->read_tail + c);
2062
2063 if (found) {
2064 if (!ldata->push)
2065 ldata->line_start = ldata->read_tail;
2066 else
2067 ldata->push = 0;
2068 tty_audit_push();
Olivier Deprez157378f2022-04-04 15:47:50 +02002069 return false;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002070 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002071
Olivier Deprez157378f2022-04-04 15:47:50 +02002072 /* No EOL found - do a continuation retry if there is more data */
2073 return ldata->read_tail != canon_head;
2074}
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002075
2076/**
2077 * job_control - check job control
2078 * @tty: tty
2079 * @file: file handle
2080 *
2081 * Perform job control management checks on this file/tty descriptor
2082 * and if appropriate send any needed signals and return a negative
2083 * error code if action should be taken.
2084 *
2085 * Locking: redirected write test is safe
2086 * current->signal->tty check is safe
2087 * ctrl_lock to safely reference tty->pgrp
2088 */
2089
2090static int job_control(struct tty_struct *tty, struct file *file)
2091{
2092 /* Job control check -- must be done at start and after
2093 every sleep (POSIX.1 7.1.1.4). */
2094 /* NOTE: not yet done after every sleep pending a thorough
2095 check of the logic of this change. -- jlc */
2096 /* don't stop on /dev/console */
Olivier Deprez157378f2022-04-04 15:47:50 +02002097 if (file->f_op->write_iter == redirected_tty_write)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002098 return 0;
2099
2100 return __tty_check_change(tty, SIGTTIN);
2101}
2102
2103
2104/**
2105 * n_tty_read - read function for tty
2106 * @tty: tty device
2107 * @file: file object
2108 * @buf: userspace buffer pointer
2109 * @nr: size of I/O
2110 *
2111 * Perform reads for the line discipline. We are guaranteed that the
2112 * line discipline will not be closed under us but we may get multiple
2113 * parallel readers and must handle this ourselves. We may also get
2114 * a hangup. Always called in user context, may sleep.
2115 *
2116 * This code must be sure never to sleep through a hangup.
2117 *
2118 * n_tty_read()/consumer path:
2119 * claims non-exclusive termios_rwsem
2120 * publishes read_tail
2121 */
2122
2123static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
Olivier Deprez157378f2022-04-04 15:47:50 +02002124 unsigned char *kbuf, size_t nr,
2125 void **cookie, unsigned long offset)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002126{
2127 struct n_tty_data *ldata = tty->disc_data;
Olivier Deprez157378f2022-04-04 15:47:50 +02002128 unsigned char *kb = kbuf;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002129 DEFINE_WAIT_FUNC(wait, woken_wake_function);
2130 int c;
2131 int minimum, time;
2132 ssize_t retval = 0;
2133 long timeout;
2134 int packet;
2135 size_t tail;
2136
Olivier Deprez157378f2022-04-04 15:47:50 +02002137 /*
2138 * Is this a continuation of a read started earler?
2139 *
2140 * If so, we still hold the atomic_read_lock and the
2141 * termios_rwsem, and can just continue to copy data.
2142 */
2143 if (*cookie) {
2144 if (ldata->icanon && !L_EXTPROC(tty)) {
2145 if (canon_copy_from_read_buf(tty, &kb, &nr))
2146 return kb - kbuf;
2147 } else {
2148 if (copy_from_read_buf(tty, &kb, &nr))
2149 return kb - kbuf;
2150 }
2151
2152 /* No more data - release locks and stop retries */
2153 n_tty_kick_worker(tty);
2154 n_tty_check_unthrottle(tty);
2155 up_read(&tty->termios_rwsem);
2156 mutex_unlock(&ldata->atomic_read_lock);
2157 *cookie = NULL;
2158 return kb - kbuf;
2159 }
2160
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002161 c = job_control(tty, file);
2162 if (c < 0)
2163 return c;
2164
2165 /*
2166 * Internal serialization of reads.
2167 */
2168 if (file->f_flags & O_NONBLOCK) {
2169 if (!mutex_trylock(&ldata->atomic_read_lock))
2170 return -EAGAIN;
2171 } else {
2172 if (mutex_lock_interruptible(&ldata->atomic_read_lock))
2173 return -ERESTARTSYS;
2174 }
2175
2176 down_read(&tty->termios_rwsem);
2177
2178 minimum = time = 0;
2179 timeout = MAX_SCHEDULE_TIMEOUT;
2180 if (!ldata->icanon) {
2181 minimum = MIN_CHAR(tty);
2182 if (minimum) {
2183 time = (HZ / 10) * TIME_CHAR(tty);
2184 } else {
2185 timeout = (HZ / 10) * TIME_CHAR(tty);
2186 minimum = 1;
2187 }
2188 }
2189
2190 packet = tty->packet;
2191 tail = ldata->read_tail;
2192
2193 add_wait_queue(&tty->read_wait, &wait);
2194 while (nr) {
2195 /* First test for status change. */
2196 if (packet && tty->link->ctrl_status) {
2197 unsigned char cs;
Olivier Deprez157378f2022-04-04 15:47:50 +02002198 if (kb != kbuf)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002199 break;
2200 spin_lock_irq(&tty->link->ctrl_lock);
2201 cs = tty->link->ctrl_status;
2202 tty->link->ctrl_status = 0;
2203 spin_unlock_irq(&tty->link->ctrl_lock);
Olivier Deprez157378f2022-04-04 15:47:50 +02002204 *kb++ = cs;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002205 nr--;
2206 break;
2207 }
2208
2209 if (!input_available_p(tty, 0)) {
2210 up_read(&tty->termios_rwsem);
2211 tty_buffer_flush_work(tty->port);
2212 down_read(&tty->termios_rwsem);
2213 if (!input_available_p(tty, 0)) {
2214 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
2215 retval = -EIO;
2216 break;
2217 }
2218 if (tty_hung_up_p(file))
2219 break;
2220 /*
2221 * Abort readers for ttys which never actually
2222 * get hung up. See __tty_hangup().
2223 */
2224 if (test_bit(TTY_HUPPING, &tty->flags))
2225 break;
2226 if (!timeout)
2227 break;
David Brazdil0f672f62019-12-10 10:32:29 +00002228 if (tty_io_nonblock(tty, file)) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002229 retval = -EAGAIN;
2230 break;
2231 }
2232 if (signal_pending(current)) {
2233 retval = -ERESTARTSYS;
2234 break;
2235 }
2236 up_read(&tty->termios_rwsem);
2237
2238 timeout = wait_woken(&wait, TASK_INTERRUPTIBLE,
2239 timeout);
2240
2241 down_read(&tty->termios_rwsem);
2242 continue;
2243 }
2244 }
2245
2246 if (ldata->icanon && !L_EXTPROC(tty)) {
Olivier Deprez157378f2022-04-04 15:47:50 +02002247 if (canon_copy_from_read_buf(tty, &kb, &nr))
2248 goto more_to_be_read;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002249 } else {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002250 /* Deal with packet mode. */
Olivier Deprez157378f2022-04-04 15:47:50 +02002251 if (packet && kb == kbuf) {
2252 *kb++ = TIOCPKT_DATA;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002253 nr--;
2254 }
2255
Olivier Deprez157378f2022-04-04 15:47:50 +02002256 /*
2257 * Copy data, and if there is more to be had
2258 * and we have nothing more to wait for, then
2259 * let's mark us for retries.
2260 *
2261 * NOTE! We return here with both the termios_sem
2262 * and atomic_read_lock still held, the retries
2263 * will release them when done.
2264 */
2265 if (copy_from_read_buf(tty, &kb, &nr) && kb - kbuf >= minimum) {
2266more_to_be_read:
2267 remove_wait_queue(&tty->read_wait, &wait);
2268 *cookie = cookie;
2269 return kb - kbuf;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002270 }
2271 }
2272
2273 n_tty_check_unthrottle(tty);
2274
Olivier Deprez157378f2022-04-04 15:47:50 +02002275 if (kb - kbuf >= minimum)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002276 break;
2277 if (time)
2278 timeout = time;
2279 }
2280 if (tail != ldata->read_tail)
2281 n_tty_kick_worker(tty);
2282 up_read(&tty->termios_rwsem);
2283
2284 remove_wait_queue(&tty->read_wait, &wait);
2285 mutex_unlock(&ldata->atomic_read_lock);
2286
Olivier Deprez157378f2022-04-04 15:47:50 +02002287 if (kb - kbuf)
2288 retval = kb - kbuf;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002289
2290 return retval;
2291}
2292
2293/**
2294 * n_tty_write - write function for tty
2295 * @tty: tty device
2296 * @file: file object
2297 * @buf: userspace buffer pointer
2298 * @nr: size of I/O
2299 *
2300 * Write function of the terminal device. This is serialized with
2301 * respect to other write callers but not to termios changes, reads
2302 * and other such events. Since the receive code will echo characters,
2303 * thus calling driver write methods, the output_lock is used in
2304 * the output processing functions called here as well as in the
2305 * echo processing function to protect the column state and space
2306 * left in the buffer.
2307 *
2308 * This code must be sure never to sleep through a hangup.
2309 *
2310 * Locking: output_lock to protect column state and space left
2311 * (note that the process_output*() functions take this
2312 * lock themselves)
2313 */
2314
2315static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
2316 const unsigned char *buf, size_t nr)
2317{
2318 const unsigned char *b = buf;
2319 DEFINE_WAIT_FUNC(wait, woken_wake_function);
2320 int c;
2321 ssize_t retval = 0;
2322
2323 /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
Olivier Deprez157378f2022-04-04 15:47:50 +02002324 if (L_TOSTOP(tty) && file->f_op->write_iter != redirected_tty_write) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002325 retval = tty_check_change(tty);
2326 if (retval)
2327 return retval;
2328 }
2329
2330 down_read(&tty->termios_rwsem);
2331
2332 /* Write out any echoed characters that are still pending */
2333 process_echoes(tty);
2334
2335 add_wait_queue(&tty->write_wait, &wait);
2336 while (1) {
2337 if (signal_pending(current)) {
2338 retval = -ERESTARTSYS;
2339 break;
2340 }
2341 if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
2342 retval = -EIO;
2343 break;
2344 }
2345 if (O_OPOST(tty)) {
2346 while (nr > 0) {
2347 ssize_t num = process_output_block(tty, b, nr);
2348 if (num < 0) {
2349 if (num == -EAGAIN)
2350 break;
2351 retval = num;
2352 goto break_out;
2353 }
2354 b += num;
2355 nr -= num;
2356 if (nr == 0)
2357 break;
2358 c = *b;
2359 if (process_output(c, tty) < 0)
2360 break;
2361 b++; nr--;
2362 }
2363 if (tty->ops->flush_chars)
2364 tty->ops->flush_chars(tty);
2365 } else {
2366 struct n_tty_data *ldata = tty->disc_data;
2367
2368 while (nr > 0) {
2369 mutex_lock(&ldata->output_lock);
2370 c = tty->ops->write(tty, b, nr);
2371 mutex_unlock(&ldata->output_lock);
2372 if (c < 0) {
2373 retval = c;
2374 goto break_out;
2375 }
2376 if (!c)
2377 break;
2378 b += c;
2379 nr -= c;
2380 }
2381 }
2382 if (!nr)
2383 break;
David Brazdil0f672f62019-12-10 10:32:29 +00002384 if (tty_io_nonblock(tty, file)) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002385 retval = -EAGAIN;
2386 break;
2387 }
2388 up_read(&tty->termios_rwsem);
2389
2390 wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
2391
2392 down_read(&tty->termios_rwsem);
2393 }
2394break_out:
2395 remove_wait_queue(&tty->write_wait, &wait);
2396 if (nr && tty->fasync)
2397 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
2398 up_read(&tty->termios_rwsem);
2399 return (b - buf) ? b - buf : retval;
2400}
2401
2402/**
2403 * n_tty_poll - poll method for N_TTY
2404 * @tty: terminal device
2405 * @file: file accessing it
2406 * @wait: poll table
2407 *
2408 * Called when the line discipline is asked to poll() for data or
2409 * for special events. This code is not serialized with respect to
2410 * other events save open/close.
2411 *
2412 * This code must be sure never to sleep through a hangup.
2413 * Called without the kernel lock held - fine
2414 */
2415
2416static __poll_t n_tty_poll(struct tty_struct *tty, struct file *file,
2417 poll_table *wait)
2418{
2419 __poll_t mask = 0;
2420
2421 poll_wait(file, &tty->read_wait, wait);
2422 poll_wait(file, &tty->write_wait, wait);
2423 if (input_available_p(tty, 1))
2424 mask |= EPOLLIN | EPOLLRDNORM;
2425 else {
2426 tty_buffer_flush_work(tty->port);
2427 if (input_available_p(tty, 1))
2428 mask |= EPOLLIN | EPOLLRDNORM;
2429 }
2430 if (tty->packet && tty->link->ctrl_status)
2431 mask |= EPOLLPRI | EPOLLIN | EPOLLRDNORM;
2432 if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
2433 mask |= EPOLLHUP;
2434 if (tty_hung_up_p(file))
2435 mask |= EPOLLHUP;
2436 if (tty->ops->write && !tty_is_writelocked(tty) &&
2437 tty_chars_in_buffer(tty) < WAKEUP_CHARS &&
2438 tty_write_room(tty) > 0)
2439 mask |= EPOLLOUT | EPOLLWRNORM;
2440 return mask;
2441}
2442
2443static unsigned long inq_canon(struct n_tty_data *ldata)
2444{
2445 size_t nr, head, tail;
2446
2447 if (ldata->canon_head == ldata->read_tail)
2448 return 0;
2449 head = ldata->canon_head;
2450 tail = ldata->read_tail;
2451 nr = head - tail;
2452 /* Skip EOF-chars.. */
2453 while (MASK(head) != MASK(tail)) {
2454 if (test_bit(tail & (N_TTY_BUF_SIZE - 1), ldata->read_flags) &&
2455 read_buf(ldata, tail) == __DISABLED_CHAR)
2456 nr--;
2457 tail++;
2458 }
2459 return nr;
2460}
2461
2462static int n_tty_ioctl(struct tty_struct *tty, struct file *file,
2463 unsigned int cmd, unsigned long arg)
2464{
2465 struct n_tty_data *ldata = tty->disc_data;
2466 int retval;
2467
2468 switch (cmd) {
2469 case TIOCOUTQ:
2470 return put_user(tty_chars_in_buffer(tty), (int __user *) arg);
2471 case TIOCINQ:
2472 down_write(&tty->termios_rwsem);
2473 if (L_ICANON(tty) && !L_EXTPROC(tty))
2474 retval = inq_canon(ldata);
2475 else
2476 retval = read_cnt(ldata);
2477 up_write(&tty->termios_rwsem);
2478 return put_user(retval, (unsigned int __user *) arg);
2479 default:
2480 return n_tty_ioctl_helper(tty, file, cmd, arg);
2481 }
2482}
2483
2484static struct tty_ldisc_ops n_tty_ops = {
2485 .magic = TTY_LDISC_MAGIC,
2486 .name = "n_tty",
2487 .open = n_tty_open,
2488 .close = n_tty_close,
2489 .flush_buffer = n_tty_flush_buffer,
2490 .read = n_tty_read,
2491 .write = n_tty_write,
2492 .ioctl = n_tty_ioctl,
2493 .set_termios = n_tty_set_termios,
2494 .poll = n_tty_poll,
2495 .receive_buf = n_tty_receive_buf,
2496 .write_wakeup = n_tty_write_wakeup,
2497 .receive_buf2 = n_tty_receive_buf2,
2498};
2499
2500/**
2501 * n_tty_inherit_ops - inherit N_TTY methods
2502 * @ops: struct tty_ldisc_ops where to save N_TTY methods
2503 *
2504 * Enables a 'subclass' line discipline to 'inherit' N_TTY methods.
2505 */
2506
2507void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
2508{
2509 *ops = n_tty_ops;
2510 ops->owner = NULL;
2511 ops->refcount = ops->flags = 0;
2512}
2513EXPORT_SYMBOL_GPL(n_tty_inherit_ops);
2514
2515void __init n_tty_init(void)
2516{
2517 tty_register_ldisc(N_TTY, &n_tty_ops);
2518}