summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko2022-01-13 01:05:03 +0100
committerDenys Vlasenko2022-01-13 01:15:10 +0100
commit68b402ee51f12f8c3b11638b042f57e025359faf (patch)
treef7db9b14b44d89c448fd7d35cae821a97695f7f3 /shell
parentd162a7b978a98b910e410dc10a40d5de12db0419 (diff)
downloadbusybox-68b402ee51f12f8c3b11638b042f57e025359faf.zip
busybox-68b402ee51f12f8c3b11638b042f57e025359faf.tar.gz
ash: ^C with SIG_INGed SIGINT should not exit the shell
function old new delta __pgetc 501 522 +21 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 4c5dd12..12b2db3 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -10784,18 +10784,24 @@ preadfd(void)
line_input_state->path_lookup = pathval();
# endif
reinit_unicode_for_ash();
+ again:
nr = read_line_input(line_input_state, cmdedit_prompt, buf, IBUFSIZ);
if (nr == 0) {
/* ^C pressed, "convert" to SIGINT */
write(STDOUT_FILENO, "^C", 2);
raise(SIGINT);
+ /* raise(SIGINT) did not work! (e.g. if SIGINT
+ * is SIG_INGed on startup, it stays SIG_IGNed)
+ */
if (trap[SIGINT]) {
buf[0] = '\n';
buf[1] = '\0';
return 1;
}
exitstatus = 128 + SIGINT;
- return -1;
+ /* bash behavior on ^C + ignored SIGINT: */
+ write(STDOUT_FILENO, "\n", 1);
+ goto again;
}
if (nr < 0) {
if (errno == 0) {