about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/utils.c11
-rw-r--r--Test/B01cd.ztst8
3 files changed, 18 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 0d2254e5a..38d0a21d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2009-03-20  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
+	* 26763: Src/utils.c: fix problem restoring directory
+	when attempting to cd to relative path and failing.
+
 	* users/13593: Src/utils.c: tidy up from 26625.
 
 2009-03-20  Peter Stephenson  <pws@csr.com>
@@ -11462,5 +11465,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.4629 $
+* $Revision: 1.4630 $
 *****************************************************
diff --git a/Src/utils.c b/Src/utils.c
index e66d5bbf9..9716e162c 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -5388,11 +5388,7 @@ lchdir(char const *path, struct dirsav *d, int hard)
     if (*path == '/') {
 #endif
 	level = -1;
-#ifdef HAVE_FCHDIR
-	if (d->dirfd < 0 && (d->dirfd = open(".", O_RDONLY | O_NOCTTY)) < 0 &&
-	    zgetdir(d) && *d->dirname != '/')
-	    d->dirfd = open("..", O_RDONLY | O_NOCTTY);
-#else
+#ifndef HAVE_FCHDIR
 	if (!d->dirname)
 	    zgetdir(d);
 #endif
@@ -5404,6 +5400,11 @@ lchdir(char const *path, struct dirsav *d, int hard)
 	    d->ino = st1.st_ino;
 	}
     }
+#ifdef HAVE_FCHDIR
+    if (d->dirfd < 0 && (d->dirfd = open(".", O_RDONLY | O_NOCTTY)) < 0 &&
+	zgetdir(d) && *d->dirname != '/')
+	d->dirfd = open("..", O_RDONLY | O_NOCTTY);
+#endif
 
 #ifdef HAVE_LSTAT
     if (!hard)
diff --git a/Test/B01cd.ztst b/Test/B01cd.ztst
index 1995971cf..b5ba4d03b 100644
--- a/Test/B01cd.ztst
+++ b/Test/B01cd.ztst
@@ -109,6 +109,14 @@ F:something is broken.  But you already knew that.
 >$mydir/cdtst.tmp/real
 >$mydir/cdtst.tmp/real
 
+ ln -s nonexistent link_to_nonexistent
+ pwd1=$(pwd -P)
+ cd -s link_to_nonexistent
+ pwd2=$(pwd -P)
+ [[ $pwd1 = $pwd2 ]] || print "Ooops, changed to directory '$pwd2'"
+0:
+?(eval):cd:3: not a directory: link_to_nonexistent
+
 %clean
 # This optional section cleans up after the test, if necessary,
 # e.g. killing processes etc.  This is in addition to the removal of *.tmp