about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--Src/exec.c1
-rw-r--r--Src/utils.c3
3 files changed, 9 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 4a477ad8a..9e9e6d89a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-09-21  Peter Stephenson  <p.w.stephenson@ntlworld.com>
+
+	* 27283: Src/exec.c, Src/utils.c: failure to dup fd accessed
+	uninitialised memory and closed the original fd regardless.
+
 2009-09-21  Peter Stephenson  <pws@csr.com>
 
 	* users/14411: Src/hashtable.c: only hash stat-able executable
@@ -12197,5 +12202,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.4784 $
+* $Revision: 1.4785 $
 *****************************************************
diff --git a/Src/exec.c b/Src/exec.c
index e68237948..ca9cf0f4d 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -1980,6 +1980,7 @@ addfd(int forked, int *save, struct multio **mfds, int fd1, int fd2, int rflag,
 		     */
 		    if (fdN < 0 && errno != EBADF) {
 			zerr("cannot duplicate fd %d: %e", fd1, errno);
+			mfds[fd1] = NULL;
 			closemnodes(mfds);
 			return;
 		    }
diff --git a/Src/utils.c b/Src/utils.c
index ad4ffca92..a12914787 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -1631,7 +1631,8 @@ movefd(int fd)
 #else
 	int fe = movefd(dup(fd));
 #endif
-	zclose(fd);
+	if (fe != -1)
+	    zclose(fd);
 	fd = fe;
     }
     if(fd != -1) {