[SCM] Samba Shared Repository - branch v3-4-test updated - release-4-0-0alpha7-1206-g06ab965

Karolin Seeger kseeger at samba.org
Tue Aug 11 08:05:54 MDT 2009


The branch, v3-4-test has been updated
       via  06ab965b72ba477505d297ab72156136ab981e93 (commit)
      from  536946c706b66d432d60c990f28ff0ed5861fa44 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test


- Log -----------------------------------------------------------------
commit 06ab965b72ba477505d297ab72156136ab981e93
Author: Tim Prouty <tprouty at samba.org>
Date:   Thu Aug 6 15:53:33 2009 -0700

    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.

-----------------------------------------------------------------------

Summary of changes:
 source3/smbd/files.c |   24 ++++++++++++++++++------
 1 files changed, 18 insertions(+), 6 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index a2200fc..54c4c73 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;
 }
 
 /****************************************************************************


-- 
Samba Shared Repository


More information about the samba-cvs mailing list