← Commit list

68b402ee5

Denys Vlasenko
Denys Vlasenko
2022-01-13
SUCCESS Duration: 153s

Subject

ash: ^C with SIG_INGed SIGINT should not exit the shell

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

loginutils/login.c+3 -1
@@ -608,7 +608,9 @@ int login_main(int argc UNUSED_PARAM, char **argv)
* But without this, bash 3.0 will not enable ctrl-c either.
* Maybe bash is buggy?
* Need to find out what standards say about /bin/login -
- * should we leave SIGINT etc enabled or disabled? */
+ * should we leave SIGINT etc enabled or disabled?
+ * Also note: sulogin does not do it! Why?
+ */
signal(SIGINT, SIG_DFL);
/* Exec login shell with no additional parameters */
loginutils/sulogin.c+5 -0
@@ -111,6 +111,11 @@ int sulogin_main(int argc UNUSED_PARAM, char **argv)
}
}
+ /*
+ * Note: login does this (should we do it too?):
+ */
+ /*signal(SIGINT, SIG_DFL);*/
+
/* Exec login shell with no additional parameters. Never returns. */
exec_login_shell(shell);
}
shell/ash.c+7 -1
@@ -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) {