diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2020-12-02 16:31:45 +1100 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2020-12-23 18:55:20 +1100 |
commit | 6359d7aa739b9f02f622805f4dbddeaf0ae61981 (patch) | |
tree | 681c7b7a3ce9cda2d54292d5304d664bd574b4be | |
parent | 1f6fc2dc2f6e64248c43f94d4c52bb762c6fefce (diff) | |
download | dash-6359d7aa739b9f02f622805f4dbddeaf0ae61981.tar.gz |
jobs: Only block in waitcmd on first run
This patch ensures that waitcmd never blocks unless there are
outstanding jobs. This could otherwise trigger a hang if children
were created prior to the shell coming into existence, or if
there are backgrounded children of other kinds (e.g., a here-
document).
Fixes: 6c691b3e5099 ("jobs: Only clear gotsigchld when waiting...")
Reported-by: Michael Biebl <biebl@debian.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | src/jobs.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -81,6 +81,7 @@ #define DOWAIT_NONBLOCK 0 #define DOWAIT_BLOCK 1 #define DOWAIT_WAITCMD 2 +#define DOWAIT_WAITCMD_ALL 4 /* array of jobs */ static struct job *jobtab; @@ -615,7 +616,7 @@ waitcmd(int argc, char **argv) jp->waited = 1; jp = jp->prev_job; } - if (!dowait(DOWAIT_WAITCMD, 0)) + if (!dowait(DOWAIT_WAITCMD_ALL, 0)) goto sigout; } } @@ -1138,6 +1139,7 @@ static int dowait(int block, struct job *jp) pid = waitone(block, jp); rpid &= !!pid; + block &= ~DOWAIT_WAITCMD_ALL; if (!pid || (jp && jp->state != JOBRUNNING)) block = DOWAIT_NONBLOCK; } while (pid >= 0); |