summaryrefslogtreecommitdiff
path: root/sys-apps/util-linux/files/util-linux-2.37.1-agetty_ctrl-c_erase.patch
blob: 4828fd449f95d45d2e06ca1062ffa43b652d526a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
From 6eb1c01e9dd25a73100f06db37190c63fd57d4d9 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 30 Jul 2021 11:50:46 +0200
Subject: [PATCH] agetty: use CTRL+C to erase username

aggety(8) from the beginning ignores ^C (the small exception was
between 2.32 and 2.34 when this char has been misinterpreted).

This patch forces agetty to interpret ^C like ^U, it means to
erase the user's input and wait for a completely new username.
The small difference is that for ^C it does not set 'kill character'.

This change does not affect serial lines where ^C is still ignored like
in previous decades. I'd like to avoid any regression as I have
no clue if any serial lines do not send this control char in some
context ...

Fixes: https://github.com/karelzak/util-linux/issues/1399
References: https://github.com/karelzak/util-linux/issues/1046
Signed-off-by: Karel Zak <kzak@redhat.com>
---
 term-utils/agetty.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/term-utils/agetty.c b/term-utils/agetty.c
index 3b3d5101a..d072d64d3 100644
--- a/term-utils/agetty.c
+++ b/term-utils/agetty.c
@@ -2267,6 +2267,11 @@ static char *get_logname(struct issue *ie, struct options *op, struct termios *t
 				break;
 			case CTL('U'):
 				cp->kill = ascval;		/* set kill character */
+				/* fallthrough */
+			case CTL('C'):
+				if (key == CTL('C') && !(op->flags & F_VCONSOLE))
+					/* Ignore CTRL+C on serial line */
+					break;
 				while (bp > logname) {
 					if ((tp->c_lflag & ECHO) == 0)
 						write_all(1, erase[cp->parity], 3);
@@ -2275,9 +2280,6 @@ static char *get_logname(struct issue *ie, struct options *op, struct termios *t
 				break;
 			case CTL('D'):
 				exit(EXIT_SUCCESS);
-			case CTL('C'):
-				/* Ignore */
-				break;
 			default:
 				if ((size_t)(bp - logname) >= sizeof(logname) - 1)
 					log_err(_("%s: input overrun"), op->tty);