From 3c465fcf5446b1de9e8332ba148d529c97c72489 Mon Sep 17 00:00:00 2001 From: Tim Prouty Date: Thu, 6 Aug 2009 15:53:33 -0700 Subject: [PATCH] s3: Fix a bug in renames of directories Recently code was added to match windows semantics of denying the rename of a directory if there are open files underneath it. This does partly match windows semantics, but it turns out the rename should be allowed if the open file handle is for the directory being renamed, or for a stream on the directory being renamed. This patch refines the check to better follow these rename semantics. Addresses bug #6620. (cherry picked from commit 06ab965b72ba477505d297ab72156136ab981e93) --- source3/smbd/files.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/source3/smbd/files.c b/source3/smbd/files.c index a2200fc46f9..54c4c732ec0 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -385,13 +385,13 @@ bool file_find_subpath(files_struct *dir_fsp) { files_struct *fsp; size_t dlen; + bool ret = false; char *d_fullname = talloc_asprintf(talloc_tos(), "%s/%s", dir_fsp->conn->connectpath, dir_fsp->fsp_name); - if (!d_fullname) { - return false; + goto out; } dlen = strlen(d_fullname); @@ -409,15 +409,27 @@ bool file_find_subpath(files_struct *dir_fsp) fsp->fsp_name); if (strnequal(d_fullname, d1_fullname, dlen)) { - TALLOC_FREE(d_fullname); + int d1_len = strlen(d1_fullname); + + /* + * If the open file is a second file handle to the + * same name or is a stream on the original file, then + * don't return true. + */ + if (d1_len == dlen || d1_fullname[dlen] == ':') { + TALLOC_FREE(d1_fullname); + continue; + } + TALLOC_FREE(d1_fullname); - return true; + ret = true; + goto out; } TALLOC_FREE(d1_fullname); } - + out: TALLOC_FREE(d_fullname); - return false; + return ret; } /**************************************************************************** -- 2.11.4.GIT