]> arthur.barton.de Git - netatalk.git/commitdiff
Fix moveandrename error
authorFrank Lahm <franklahm@googlemail.com>
Wed, 23 Mar 2011 11:52:03 +0000 (12:52 +0100)
committerFrank Lahm <franklahm@googlemail.com>
Wed, 23 Mar 2011 11:52:03 +0000 (12:52 +0100)
etc/afpd/file.c
etc/afpd/filedir.c

index 434d9b5c0f56e4be1a7812a77bf4410a97121404..cb3af78af52d21ee364075ccd24d8fb85e9df36e 100644 (file)
@@ -1097,6 +1097,9 @@ int renamefile(const struct vol *vol, int sdir_fd, char *src, char *dst, char *n
 {
     int                rc;
 
+    LOG(log_debug, logtype_afpd,
+        "renamefile: src[%d, \"%s\"] -> dst[\"%s\"]", sdir_fd, src, dst);
+
     if ( unix_rename( sdir_fd, src, -1, dst ) < 0 ) {
         switch ( errno ) {
         case ENOENT :
index 8644225b07879b1bd4791f52d8b3e5bdaaecb1e2..0e9c367023a7161dcb2f4c3dfff7c30b7577bbcd 100644 (file)
@@ -328,7 +328,7 @@ static int moveandrename(const struct vol *vol,
                          char *newname,
                          int isdir)
 {
-    char            *p;
+    char            *oldunixname = NULL;
     char            *upath;
     int             rc;
     struct stat     *st, nst;
@@ -340,12 +340,16 @@ static int moveandrename(const struct vol *vol,
     cnid_t          id;
     int             cwd_fd = -1;
 
+    LOG(log_debug, logtype_afpd,
+        "moveandrename: [\"%s\"/\"%s\"] -> \"%s\"",
+        cfrombstr(sdir->d_u_name), oldname, newname);
+
     ad_init(&ad, vol->v_adouble, vol->v_ad_options);
     adp = &ad;
     adflags = 0;
 
     if (!isdir) {
-        if ((p = mtoupath(vol, oldname, sdir->d_did, utf8_encoding())) == NULL)
+        if ((oldunixname = strdup(mtoupath(vol, oldname, sdir->d_did, utf8_encoding()))) == NULL)
             return AFPERR_PARAM; /* can't convert */
 
 #ifndef HAVE_ATFUNCS
@@ -357,7 +361,7 @@ static int moveandrename(const struct vol *vol,
 #endif /* HAVE_ATFUNCS */
 
         path.st_valid = 0;
-        path.u_name = p;
+        path.u_name = oldunixname;
 #ifdef HAVE_ATFUNCS
         opened = of_findnameat(sdir_fd, &path);
 #else
@@ -369,19 +373,19 @@ static int moveandrename(const struct vol *vol,
         }
     } else {
         id = sdir->d_did; /* we already have the CNID */
-        p = ctoupath( vol, dirlookup(vol, sdir->d_pdid), oldname );
-        if (!p) {
+        if ((oldunixname = strdup(ctoupath( vol, dirlookup(vol, sdir->d_pdid), oldname))) == NULL)
             return AFPERR_PARAM;
-        }
         adflags = ADFLAGS_DIR;
     }
 
+    LOG(log_debug, logtype_afpd, "oldunixname: \"%s\"", oldunixname);
+
     /*
-     * p now points to either
+     * oldunixname now points to either
      *   a) full pathname of the source fs object (if renameat is not available)
      *   b) the oldname (renameat is available)
      * we are in the dest folder so we need to use 
-     *   a) p for ad_open
+     *   a) oldunixname for ad_open
      *   b) fchdir sdir_fd before eg ad_open or use *at functions where appropiate
      */
 
@@ -393,7 +397,7 @@ static int moveandrename(const struct vol *vol,
             goto exit;
         }
     }
-    if (!ad_metadata(p, adflags, adp)) {
+    if (!ad_metadata(oldunixname, adflags, adp)) {
         u_int16_t bshort;
 
         ad_getattr(adp, &bshort);
@@ -429,7 +433,7 @@ static int moveandrename(const struct vol *vol,
         }
 
         if (stat(upath, st) == 0 || caseenumerate(vol, &path, curdir) == 0) {
-            if (!stat(p, &nst) && !(nst.st_dev == st->st_dev && nst.st_ino == st->st_ino) ) {
+            if (!stat(oldunixname, &nst) && !(nst.st_dev == st->st_dev && nst.st_ino == st->st_ino) ) {
                 /* not the same file */
                 rc = AFPERR_EXIST;
                 goto exit;
@@ -441,18 +445,20 @@ static int moveandrename(const struct vol *vol,
         goto exit;
     }
 
+    LOG(log_debug, logtype_afpd, "oldunixname: \"%s\"", oldunixname);
+
     if ( !isdir ) {
         path.st_valid = 1;
         path.st_errno = errno;
         if (of_findname(&path)) {
             rc = AFPERR_EXIST; /* was AFPERR_BUSY; */
         } else {
-            rc = renamefile(vol, sdir_fd, p, upath, newname, adp );
+            rc = renamefile(vol, sdir_fd, oldunixname, upath, newname, adp );
             if (rc == AFP_OK)
                 of_rename(vol, opened, sdir, oldname, curdir, newname);
         }
     } else {
-        rc = renamedir(vol, sdir_fd, p, upath, sdir, curdir, newname);
+        rc = renamedir(vol, sdir_fd, oldunixname, upath, sdir, curdir, newname);
     }
     if ( rc == AFP_OK && id ) {
         /* renaming may have moved the file/dir across a filesystem */
@@ -475,6 +481,8 @@ static int moveandrename(const struct vol *vol,
 exit:
     if (cwd_fd != -1)
         close(cwd_fd);
+    if (oldunixname)
+        free(oldunixname);
     return rc;
 }