← Commit list

1fdb33bd0

Denys Vlasenko
Denys Vlasenko
2023-01-30
SUCCESS Duration: 164s

Subject

hush: restore tty pgrp on SIGHUP

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 →

shell/hush.c+8 -5
@@ -1831,7 +1831,10 @@ static void restore_G_args(save_arg_t *sv, char **argv)
* SIGHUP (interactive):
* send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit
//HUP: we don't need to do this, kernel does this for us
-//HUP: ("orphaned process group" handling according to POSIX)
+//HUP: ("orphaned process group" handling according to POSIX).
+//HUP: We still have a SIGHUP handler, just to have tty pgrp restored
+//HUP: (otherwise e.g. Midnight Commander backgrounds when hush
+//HUP: started from it gets killed by SIGHUP).
* SIGTTIN, SIGTTOU, SIGTSTP (if job control is on): ignore
* Note that ^Z is handled not by trapping SIGTSTP, but by seeing
* that all pipe members are stopped. Try this in bash:
@@ -1933,7 +1936,7 @@ enum {
SPECIAL_INTERACTIVE_SIGS = 0
| (1 << SIGTERM)
| (1 << SIGINT)
-//HUP | (1 << SIGHUP)
+ | (1 << SIGHUP)
,
SPECIAL_JOBSTOP_SIGS = 0
#if ENABLE_HUSH_JOB
@@ -2179,7 +2182,7 @@ static int check_and_run_traps(void)
last_sig = sig;
break;
#if ENABLE_HUSH_JOB
-//HUP case SIGHUP: {
+ case SIGHUP: {
//HUP//TODO: why are we doing this? ash and dash don't do this,
//HUP//they have no handler for SIGHUP at all,
//HUP//they rely on kernel to send SIGHUP+SIGCONT to orphaned process groups
@@ -2194,8 +2197,8 @@ static int check_and_run_traps(void)
//HUP if (kill(- job->pgrp, SIGHUP) == 0)
//HUP kill(- job->pgrp, SIGCONT);
//HUP }
-//HUP sigexit(SIGHUP);
-//HUP }
+ sigexit(SIGHUP);
+ }
#endif
#if ENABLE_HUSH_FAST
case SIGCHLD: