From: Frank Lahm Date: Wed, 23 Mar 2011 11:52:03 +0000 (+0100) Subject: Fix moveandrename error X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;ds=sidebyside;h=2830bcab301d9f9becf4ad38d3fd90e1ef6752fe;p=netatalk.git Fix moveandrename error --- diff --git a/etc/afpd/file.c b/etc/afpd/file.c index 434d9b5c..cb3af78a 100644 --- a/etc/afpd/file.c +++ b/etc/afpd/file.c @@ -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 : diff --git a/etc/afpd/filedir.c b/etc/afpd/filedir.c index 8644225b..0e9c3670 100644 --- a/etc/afpd/filedir.c +++ b/etc/afpd/filedir.c @@ -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; }