about summary refs log tree commit diff
path: root/Src/utils.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2011-07-25 10:20:09 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2011-07-25 10:20:09 +0000
commit45913f43e54beacca4feb614bbe80089cec6f490 (patch)
treedcf8b3e97051507bde2b2ce64a185714ddbc5a82 /Src/utils.c
parent164cf1abd5b006ef2db104aeab37ecfff51ad697 (diff)
downloadzsh-45913f43e54beacca4feb614bbe80089cec6f490.tar.gz
zsh-45913f43e54beacca4feb614bbe80089cec6f490.tar.xz
zsh-45913f43e54beacca4feb614bbe80089cec6f490.zip
29561: Allow closing of fd's not recorded by the shell
Diffstat (limited to 'Src/utils.c')
-rw-r--r--Src/utils.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/Src/utils.c b/Src/utils.c
index d50311637..f460c0fb3 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -1802,22 +1802,20 @@ zclose(int fd)
 {
     if (fd >= 0) {
 	/*
-	 * We sometimes zclose() an fd twice where the second
-	 * time is a catch-all in case there was a failure using
-	 * the fd.  This is harmless but we need to trap it
-	 * for the error check here.
+	 * Careful: we allow closing of arbitrary fd's, beyond
+	 * max_zsh_fd.  In that case we don't try anything clever.
 	 */
-	DPUTS2(fd > max_zsh_fd && fdtable[fd] != FDT_UNUSED,
-	       "BUG: fd is %d, max_zsh_fd is %d", fd, max_zsh_fd);
-	if (fdtable[fd] == FDT_FLOCK)
-	    fdtable_flocks--;
-	fdtable[fd] = FDT_UNUSED;
-	while (max_zsh_fd > 0 && fdtable[max_zsh_fd] == FDT_UNUSED)
-	    max_zsh_fd--;
-	if (fd == coprocin)
-	    coprocin = -1;
-	if (fd == coprocout)
-	    coprocout = -1;
+	if (fd <= max_zsh_fd) {
+	    if (fdtable[fd] == FDT_FLOCK)
+		fdtable_flocks--;
+	    fdtable[fd] = FDT_UNUSED;
+	    while (max_zsh_fd > 0 && fdtable[max_zsh_fd] == FDT_UNUSED)
+		max_zsh_fd--;
+	    if (fd == coprocin)
+		coprocin = -1;
+	    if (fd == coprocout)
+		coprocout = -1;
+	}
 	return close(fd);
     }
     return -1;