* PATCH: Handling of tempfile open failure
@ 2016-09-28 6:50 Bart Schaefer
0 siblings, 0 replies; only message in thread
From: Bart Schaefer @ 2016-09-28 6:50 UTC (permalink / raw)
To: zsh-workers
Separating this from the thread about TMPSUFFIX.
Manufacturing a conflict by stepping through the debugger:
torch% print -l X =(:) X
zsh: process substitution failed: file exists
torch% print $?
1
diff --git a/Src/exec.c b/Src/exec.c
index c27c41c..bdbad76 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -4332,11 +4332,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 */
@@ -4347,7 +4353,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;
diff --git a/Src/utils.c b/Src/utils.c
index b434821..db43529 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -2164,6 +2164,7 @@ gettempfile(const char *prefix, int use_heap, char **tempname)
#if HAVE_MKSTEMP
char *suffix = prefix ? ".XXXXXX" : "XXXXXX";
+ queue_signals();
if (!prefix && !(prefix = getsparam("TMPPREFIX")))
prefix = DEFAULT_TMPPREFIX;
if (use_heap)
@@ -2180,6 +2181,7 @@ gettempfile(const char *prefix, int use_heap, char **tempname)
#else
int failures = 0;
+ queue_signals();
do {
if (!(fn = gettempname(prefix, use_heap))) {
fd = -1;
@@ -2193,6 +2195,8 @@ gettempfile(const char *prefix, int use_heap, char **tempname)
} while (errno == EEXIST && ++failures < 16);
#endif
*tempname = fn;
+
+ unqueue_signals();
return fd;
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2016-09-28 6:50 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-28 6:50 PATCH: Handling of tempfile open failure Bart Schaefer
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).