about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2004-11-29 12:09:13 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2004-11-29 12:09:13 +0000
commitd2c67e5e19953c2bee353635c3e8aec7c38f8d57 (patch)
treeb67937542b8d5290bb1fa657236172651ee9e991
parentcebe5f1d10418b6fc7dec0eab5bfe5d62bd0bb74 (diff)
downloadzsh-d2c67e5e19953c2bee353635c3e8aec7c38f8d57.tar.gz
zsh-d2c67e5e19953c2bee353635c3e8aec7c38f8d57.tar.xz
zsh-d2c67e5e19953c2bee353635c3e8aec7c38f8d57.zip
20591: Stephane Chazelas: use of fchdir in zchdir leaked fd's
-rw-r--r--ChangeLog3
-rw-r--r--Src/compat.c10
2 files changed, 10 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 4775b505d..3a9981dda 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2004-11-29  Peter Stephenson  <pws@csr.com>
 
+	* 20591: Stephane Chazelas <Stephane_Chazelas@yahoo.fr>:
+	use of fchdir to change directory leaked filed descriptors.
+
 	* 20592: Src/math.c: $((##)) caused mayhem by passing null
 	string to getkeystring().  Report error instead.
 
diff --git a/Src/compat.c b/Src/compat.c
index 2999e63e4..ba077d3a0 100644
--- a/Src/compat.c
+++ b/Src/compat.c
@@ -387,10 +387,14 @@ zchdir(char *dir)
     int currdir = -2;
 
     for (;;) {
-	if (!*dir)
-	    return 0;
-	if (!chdir(dir))
+	if (!*dir || !chdir(dir))
+	{
+#ifdef HAVE_FCHDIR
+           if (currdir >= 0)
+               close(currdir);
+#endif
 	    return 0;
+	}
 	if ((errno != ENAMETOOLONG && errno != ENOMEM) ||
 	    strlen(dir) < PATH_MAX)
 	    break;