]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/directory.c
previous commit 'lchdir: use chdir + getcwd' was only testing for symlink outside...
[netatalk.git] / etc / afpd / directory.c
index dba836608a56215c874154af4de238dd92e85bde..8e41298f48c9df474cc48009b3812df2501e30a2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: directory.c,v 1.135 2010-02-19 11:29:51 franklahm Exp $
+ * $Id: directory.c,v 1.137 2010-02-28 22:29:15 didg Exp $
  *
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
@@ -1553,8 +1553,7 @@ int movecwd(struct vol *vol, struct dir *dir)
     }
 
     p = path + sizeof(path) - 1;
-    *p-- = '\0';
-    *p = '.';
+    *p = '\0';
     for ( d = dir; d->d_parent != NULL && d != curdir; d = d->d_parent ) {
         u = d->d_u_name;
         if (!u) {
@@ -1581,12 +1580,17 @@ int movecwd(struct vol *vol, struct dir *dir)
         p -= n;
         memcpy( p, vol->v_path, n );
     }
-    if ( (ret = lchdir( p )) != 0 ) {
+    if ( (ret = lchdir(p )) != 0 ) {
         LOG(log_debug, logtype_afpd, "movecwd('%s'): ret:%d, %u/%s", p, ret, errno, strerror(errno));
 
         if (ret == 1) {
-            /* p is a symlink */
+            /* p is a symlink or getcwd failed */
             afp_errno = AFPERR_BADTYPE;
+            vol->v_curdir = curdir = vol->v_dir;
+            if (chdir(vol->v_path ) < 0) {
+                LOG(log_debug, logtype_afpd, "can't chdir back'%s': %s", vol->v_path, strerror(errno));
+                /* XXX what do we do here? */
+            }
             return -1;
         }
         switch (errno) {