about summary refs log tree commit diff
path: root/Src/exec.c
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2016-09-29 11:16:24 -0700
committerBarton E. Schaefer <schaefer@zsh.org>2016-09-29 11:16:24 -0700
commite61ed2b80d60ca095006d7512f90c07e6c572ee0 (patch)
treef0a8e9d6b22efd84057d7ba9646b1173d9df366d /Src/exec.c
parent6ce696f35236dc4c1b6249c6f1e7f64cc95a6046 (diff)
downloadzsh-e61ed2b80d60ca095006d7512f90c07e6c572ee0.tar.gz
zsh-e61ed2b80d60ca095006d7512f90c07e6c572ee0.tar.xz
zsh-e61ed2b80d60ca095006d7512f90c07e6c572ee0.zip
39470: failure to open a supposedly unique temp file name should result in an error
Also band-aid for signal-related race conditions in temp file name generation
Diffstat (limited to 'Src/exec.c')
-rw-r--r--Src/exec.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/Src/exec.c b/Src/exec.c
index e3915ddfe..04868bd37 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -4412,11 +4412,17 @@ getoutputfile(char *cmd, char **eptr)
 	    untokenize(s);
     }
 
-    addfilelist(nam, 0);
+    if (!s)             /* Unclear why we need to do this before open() */
+	child_block();  /* but it has been so for a long time: leave it */
 
-    if (!s)
-	child_block();
-    fd = open(nam, O_WRONLY | O_CREAT | O_EXCL | O_NOCTTY, 0600);
+    if ((fd = open(nam, O_WRONLY | O_CREAT | O_EXCL | O_NOCTTY, 0600)) < 0) {
+	zerr("process substitution failed: %e", errno);
+	free(nam);
+	if (!s)
+	    child_unblock();
+	return NULL;
+    }
+    addfilelist(nam, 0);
 
     if (s) {
 	/* optimised here-string */
@@ -4427,7 +4433,7 @@ getoutputfile(char *cmd, char **eptr)
 	return nam;
     }
 
-    if (fd < 0 || (cmdoutpid = pid = zfork(NULL)) == -1) {
+    if ((cmdoutpid = pid = zfork(NULL)) == -1) {
 	/* fork or open error */
 	child_unblock();
 	return nam;