diff options
| author | Ron Yorston <rmy@pobox.com> | 2018-12-13 15:18:20 +0000 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2018-12-13 15:35:12 +0000 |
| commit | 858091c25687727c335880dca459fe5b24259009 (patch) | |
| tree | c07a68285bc3a2bcc700df251b43058bb24dbdb3 | |
| parent | c17f7130a77698ba440525919a20d08b26333dd3 (diff) | |
| download | busybox-w32-858091c25687727c335880dca459fe5b24259009.tar.gz busybox-w32-858091c25687727c335880dca459fe5b24259009.tar.bz2 busybox-w32-858091c25687727c335880dca459fe5b24259009.zip | |
ash: prevent ctrl-c from killing background processes
spawn_forkshell() was missing some code that would normally have
been run from forkchild when a background process was started:
- the ctrl-c handler wasn't disabled;
- standard input wasn't connected to /dev/null.
Using ctrl-c to kill a foreground process also killed background
processes.
Fixing this requires passing the forkshell mode and the number of
processes associated with the forkshell job to the child process.
| -rw-r--r-- | shell/ash.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/shell/ash.c b/shell/ash.c index 188ec0979..0b41e7931 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -355,6 +355,10 @@ struct forkshell { | |||
| 355 | /* type of forkshell */ | 355 | /* type of forkshell */ |
| 356 | int fpid; | 356 | int fpid; |
| 357 | 357 | ||
| 358 | /* generic data, used by forkshell_child */ | ||
| 359 | int mode; | ||
| 360 | int nprocs; | ||
| 361 | |||
| 358 | /* optional data, used by forkshell_child */ | 362 | /* optional data, used by forkshell_child */ |
| 359 | int flags; | 363 | int flags; |
| 360 | int fd[3]; | 364 | int fd[3]; |
| @@ -15100,6 +15104,8 @@ spawn_forkshell(struct job *jp, struct forkshell *fs, int mode) | |||
| 15100 | intptr_t ret; | 15104 | intptr_t ret; |
| 15101 | 15105 | ||
| 15102 | new = forkshell_prepare(fs); | 15106 | new = forkshell_prepare(fs); |
| 15107 | new->mode = mode; | ||
| 15108 | new->nprocs = jp == NULL ? 0 : jp->nprocs; | ||
| 15103 | sprintf(buf, "%p", new->hMapFile); | 15109 | sprintf(buf, "%p", new->hMapFile); |
| 15104 | argv[2] = buf; | 15110 | argv[2] = buf; |
| 15105 | ret = mingw_spawn_proc(argv); | 15111 | ret = mingw_spawn_proc(argv); |
| @@ -15725,6 +15731,14 @@ forkshell_init(const char *idstr) | |||
| 15725 | reinitvar(); | 15731 | reinitvar(); |
| 15726 | 15732 | ||
| 15727 | shlvl++; | 15733 | shlvl++; |
| 15734 | if (fs->mode == FORK_BG) { | ||
| 15735 | SetConsoleCtrlHandler(NULL, TRUE); | ||
| 15736 | if (fs->nprocs == 0) { | ||
| 15737 | close(0); | ||
| 15738 | if (open(bb_dev_null, O_RDONLY) != 0) | ||
| 15739 | ash_msg_and_raise_perror("can't open '%s'", bb_dev_null); | ||
| 15740 | } | ||
| 15741 | } | ||
| 15728 | forkshell_child(fs); | 15742 | forkshell_child(fs); |
| 15729 | } | 15743 | } |
| 15730 | 15744 | ||
