summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2015-08-11 08:53:12 -0700
committerBarton E. Schaefer <schaefer@zsh.org>2015-08-11 08:55:23 -0700
commit128bf385b1e8256e412d732fa9b80ecd7c5e2c73 (patch)
treef1404739219127f9ef6a80473bcb810fd4374dcc
parenta01f29c11de0df084a9a1e6b932b2937936d2119 (diff)
downloadzsh-128bf385b1e8256e412d732fa9b80ecd7c5e2c73.tar.gz
zsh-128bf385b1e8256e412d732fa9b80ecd7c5e2c73.zip
36104: change order of child_block() and dont_queue_signals() to resolve yet another race condition
-rw-r--r--ChangeLog3
-rw-r--r--Src/exec.c2
-rw-r--r--Src/jobs.c4
3 files changed, 6 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 59ed6f638..816070975 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2015-08-11 Barton E. Schaefer <schaefer@zsh.org>
+ * 36104: Src/exec.c, Src/jobs.c: change order of child_block()
+ and dont_queue_signals() to resolve yet another race condition
+
* 36092: Doc/Zsh/mod_zpty.yo, Src/Modules/zpty.c: return the pty
master file descriptor in $REPLY for use with "zle -F" etc.
diff --git a/Src/exec.c b/Src/exec.c
index a635c18ed..45f1c66f0 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -1607,8 +1607,8 @@ execpline(Estate state, wordcode slcode, int how, int last1)
!(jobtab[list_pipe_job].stat & STAT_STOPPED)) {
int q = queue_signal_level();
child_unblock();
- dont_queue_signals();
child_block();
+ dont_queue_signals();
restore_queue_signals(q);
}
if (list_pipe_child &&
diff --git a/Src/jobs.c b/Src/jobs.c
index 933348851..ed647b87e 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -1420,9 +1420,9 @@ zwaitjob(int job, int wait_cmd)
int q = queue_signal_level();
Job jn = jobtab + job;
- dont_queue_signals();
child_block(); /* unblocked during signal_suspend() */
queue_traps(wait_cmd);
+ dont_queue_signals();
if (jn->procs || jn->auxprocs) { /* if any forks were done */
jn->stat |= STAT_LOCKED;
if (jn->stat & STAT_CHANGED)
@@ -1478,9 +1478,9 @@ zwaitjob(int job, int wait_cmd)
pipestats[0] = lastval;
numpipestats = 1;
}
+ restore_queue_signals(q);
unqueue_traps();
child_unblock();
- restore_queue_signals(q);
return 0;
}