summaryrefslogtreecommitdiff
path: root/sys-apps/util-linux/files/util-linux-2.37.1-agetty_ctrl-c_erase.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-apps/util-linux/files/util-linux-2.37.1-agetty_ctrl-c_erase.patch')
-rw-r--r--sys-apps/util-linux/files/util-linux-2.37.1-agetty_ctrl-c_erase.patch50
1 files changed, 50 insertions, 0 deletions
diff --git a/sys-apps/util-linux/files/util-linux-2.37.1-agetty_ctrl-c_erase.patch b/sys-apps/util-linux/files/util-linux-2.37.1-agetty_ctrl-c_erase.patch
new file mode 100644
index 000000000000..4828fd449f95
--- /dev/null
+++ b/sys-apps/util-linux/files/util-linux-2.37.1-agetty_ctrl-c_erase.patch
@@ -0,0 +1,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);