[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-2261-gef55c2b

Tim Prouty tprouty at samba.org
Thu Jun 11 18:04:27 GMT 2009


The branch, master has been updated
       via  ef55c2bd91181d896e0a4d05b72e9da8bfb7b915 (commit)
       via  62f36b163df76b36e7c58471748a1fbb6307270c (commit)
       via  3950675bbddfc32529a4f6f7ea6e4be557f38a8f (commit)
       via  6eadb8a2855c729e742c72afcc9585adccc7bb12 (commit)
      from  cc216340a61d1d48a2b9844f66061b59c674465b (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit ef55c2bd91181d896e0a4d05b72e9da8bfb7b915
Author: Tim Prouty <tprouty at samba.org>
Date:   Thu Jun 11 10:30:29 2009 -0700

    s3 passdb ads: add missing character

commit 62f36b163df76b36e7c58471748a1fbb6307270c
Author: Tim Prouty <tprouty at samba.org>
Date:   Wed Jun 10 19:49:31 2009 -0700

    s3: Prepare the rename path for passing smb_filename to SMB_VFS_CREATE_FILE

commit 3950675bbddfc32529a4f6f7ea6e4be557f38a8f
Author: Tim Prouty <tprouty at samba.org>
Date:   Wed Jun 10 16:08:34 2009 -0700

    s3: Prepare the do_unlink path for passing smb_filname to SMB_VFS_CREATE_FILE

commit 6eadb8a2855c729e742c72afcc9585adccc7bb12
Author: Tim Prouty <tprouty at samba.org>
Date:   Wed Jun 10 16:02:00 2009 -0700

    s3: refactor utility function to handle splitting the directory from the mask

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

Summary of changes:
 source3/passdb/pdb_ads.c |    2 +-
 source3/smbd/reply.c     |  434 ++++++++++++++++++++++++++--------------------
 2 files changed, 246 insertions(+), 190 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/passdb/pdb_ads.c b/source3/passdb/pdb_ads.c
index c2f1e20..9494915 100644
--- a/source3/passdb/pdb_ads.c
+++ b/source3/passdb/pdb_ads.c
@@ -1438,7 +1438,7 @@ static NTSTATUS pdb_ads_enum_alias_memberships(struct pdb_methods *m,
 		goto done;
 	}
 
-	rc = tldap_search_fmt(state->ld, state->domaindn, LDAP_SCOPE_SUB,
+	rc = tldap_search_fmt(state->ld, state->domaindn, TLDAP_SCOPE_SUB,
 			      attrs, ARRAY_SIZE(attrs), 0, talloc_tos(),
 			      &msg, "%s))", filter);
 	TALLOC_FREE(filter);
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index f91a3c7..3db11b9 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1327,6 +1327,38 @@ void reply_dskattr(struct smb_request *req)
 	return;
 }
 
+/*
+ * Utility function to split the filename from the directory.
+ */
+static NTSTATUS split_fname_dir_mask(TALLOC_CTX *ctx, const char *fname_in,
+				     char **fname_dir_out,
+				     char **fname_mask_out)
+{
+	const char *p = NULL;
+	char *fname_dir = NULL;
+	char *fname_mask = NULL;
+
+	p = strrchr_m(fname_in, '/');
+	if (!p) {
+		fname_dir = talloc_strdup(ctx, ".");
+		fname_mask = talloc_strdup(ctx, fname_in);
+	} else {
+		fname_dir = talloc_strndup(ctx, fname_in,
+		    PTR_DIFF(p, fname_in));
+		fname_mask = talloc_strdup(ctx, p+1);
+	}
+
+	if (!fname_dir || !fname_mask) {
+		TALLOC_FREE(fname_dir);
+		TALLOC_FREE(fname_mask);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	*fname_dir_out = fname_dir;
+	*fname_mask_out = fname_mask;
+	return NT_STATUS_OK;
+}
+
 /****************************************************************************
  Reply to a search.
  Can be called from SMBsearch, SMBffirst or SMBfunique.
@@ -2385,10 +2417,10 @@ static NTSTATUS can_rename(connection_struct *conn, files_struct *fsp,
 
 static NTSTATUS do_unlink(connection_struct *conn,
 			struct smb_request *req,
-			const char *fname,
+			struct smb_filename *smb_fname,
 			uint32 dirtype)
 {
-	SMB_STRUCT_STAT sbuf;
+	char *fname = NULL;
 	uint32 fattr;
 	files_struct *fsp;
 	uint32 dirtype_orig = dirtype;
@@ -2400,11 +2432,16 @@ static NTSTATUS do_unlink(connection_struct *conn,
 		return NT_STATUS_MEDIA_WRITE_PROTECTED;
 	}
 
-	if (SMB_VFS_LSTAT(conn,fname,&sbuf) != 0) {
+	status = get_full_smb_filename(smb_fname, smb_fname, &fname);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+
+	if (SMB_VFS_LSTAT(conn, fname, &smb_fname->st) != 0) {
 		return map_nt_error_from_unix(errno);
 	}
 
-	fattr = dos_mode(conn,fname,&sbuf);
+	fattr = dos_mode(conn, fname, &smb_fname->st);
 
 	if (dirtype & FILE_ATTRIBUTE_NORMAL) {
 		dirtype = aDIR|aARCH|aRONLY;
@@ -2495,7 +2532,7 @@ static NTSTATUS do_unlink(connection_struct *conn,
 		 NULL,			/* ea_list */
 		 &fsp,			/* result */
 		 NULL,			/* pinfo */
-		 &sbuf);		/* psbuf */
+		 &smb_fname->st);	/* psbuf */
 
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(10, ("SMB_VFS_CREATEFILE failed: %s\n",
@@ -2521,39 +2558,23 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
 			  uint32 dirtype, const char *name_in, bool has_wild)
 {
 	struct smb_filename *smb_fname = NULL;
-	const char *directory = NULL;
-	char *mask = NULL;
-	char *name = NULL;
-	char *p = NULL;
+	char *fname_dir = NULL;
+	char *fname_mask = NULL;
 	int count=0;
 	NTSTATUS status = NT_STATUS_OK;
-	SMB_STRUCT_STAT st;
 	TALLOC_CTX *ctx = talloc_tos();
 
 	status = unix_convert(ctx, conn, name_in, &smb_fname,
 			      has_wild ? UCF_ALLOW_WCARD_LCOMP : 0);
 	if (!NT_STATUS_IS_OK(status)) {
-		return status;
+		goto out;
 	}
 
-	status = get_full_smb_filename(ctx, smb_fname, &name);
+	/* Split up the directory from the filename/mask. */
+	status = split_fname_dir_mask(ctx, smb_fname->base_name,
+				      &fname_dir, &fname_mask);
 	if (!NT_STATUS_IS_OK(status)) {
-		TALLOC_FREE(smb_fname);
-		return status;
-	}
-
-	p = strrchr_m(name,'/');
-	if (!p) {
-		directory = talloc_strdup(ctx, ".");
-		if (!directory) {
-			TALLOC_FREE(smb_fname);
-			return NT_STATUS_NO_MEMORY;
-		}
-		mask = name;
-	} else {
-		*p = 0;
-		directory = name;
-		mask = p+1;
+		goto out;
 	}
 
 	/*
@@ -2565,38 +2586,44 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
 	 * Tine Smukavec <valentin.smukavec at hermes.si>.
 	 */
 
-	if (!VALID_STAT(smb_fname->st) && mangle_is_mangled(mask,conn->params)) {
+	if (!VALID_STAT(smb_fname->st) &&
+	    mangle_is_mangled(fname_mask, conn->params)) {
 		char *new_mask = NULL;
-		mangle_lookup_name_from_8_3(ctx,
-				mask,
-				&new_mask,
-				conn->params );
+		mangle_lookup_name_from_8_3(ctx, fname_mask,
+					    &new_mask, conn->params);
 		if (new_mask) {
-			mask = new_mask;
+			TALLOC_FREE(fname_mask);
+			fname_mask = new_mask;
 		}
 	}
-	TALLOC_FREE(smb_fname);
 
 	if (!has_wild) {
-		directory = talloc_asprintf(ctx,
-				"%s/%s",
-				directory,
-				mask);
-		if (!directory) {
-			return NT_STATUS_NO_MEMORY;
+
+		/*
+		 * Only one file needs to be unlinked. Append the mask back
+		 * onto the directory.
+		 */
+		TALLOC_FREE(smb_fname->base_name);
+		smb_fname->base_name = talloc_asprintf(smb_fname,
+						       "%s/%s",
+						       fname_dir,
+						       fname_mask);
+		if (!smb_fname->base_name) {
+			status = NT_STATUS_NO_MEMORY;
+			goto out;
 		}
 		if (dirtype == 0) {
 			dirtype = FILE_ATTRIBUTE_NORMAL;
 		}
 
-		status = check_name(conn, directory);
+		status = check_name(conn, smb_fname->base_name);
 		if (!NT_STATUS_IS_OK(status)) {
-			return status;
+			goto out;
 		}
 
-		status = do_unlink(conn, req, directory, dirtype);
+		status = do_unlink(conn, req, smb_fname, dirtype);
 		if (!NT_STATUS_IS_OK(status)) {
-			return status;
+			goto out;
 		}
 
 		count++;
@@ -2606,23 +2633,29 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
 		const char *dname;
 
 		if ((dirtype & SAMBA_ATTRIBUTES_MASK) == aDIR) {
-			return NT_STATUS_OBJECT_NAME_INVALID;
+			status = NT_STATUS_OBJECT_NAME_INVALID;
+			goto out;
 		}
 
-		if (strequal(mask,"????????.???")) {
-			mask[0] = '*';
-			mask[1] = '\0';
+		if (strequal(fname_mask,"????????.???")) {
+			TALLOC_FREE(fname_mask);
+			fname_mask = talloc_strdup(ctx, "*");
+			if (!fname_mask) {
+				status = NT_STATUS_NO_MEMORY;
+				goto out;
+			}
 		}
 
-		status = check_name(conn, directory);
+		status = check_name(conn, fname_dir);
 		if (!NT_STATUS_IS_OK(status)) {
-			return status;
+			goto out;
 		}
 
-		dir_hnd = OpenDir(talloc_tos(), conn, directory, mask,
+		dir_hnd = OpenDir(talloc_tos(), conn, fname_dir, fname_mask,
 				  dirtype);
 		if (dir_hnd == NULL) {
-			return map_nt_error_from_unix(errno);
+			status = map_nt_error_from_unix(errno);
+			goto out;
 		}
 
 		/* XXXX the CIFS spec says that if bit0 of the flags2 field is set then
@@ -2632,12 +2665,10 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
 
 		status = NT_STATUS_NO_SUCH_FILE;
 
-		while ((dname = ReadDirName(dir_hnd, &offset, &st))) {
-			char *fname = NULL;
-
-			if (!is_visible_file(conn, directory, dname, &st,
-			    true))
-			{
+		while ((dname = ReadDirName(dir_hnd, &offset,
+					    &smb_fname->st))) {
+			if (!is_visible_file(conn, fname_dir, dname,
+					     &smb_fname->st, true)) {
 				continue;
 			}
 
@@ -2646,34 +2677,36 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
 				continue;
 			}
 
-			if(!mask_match(dname, mask, conn->case_sensitive)) {
+			if(!mask_match(dname, fname_mask,
+				       conn->case_sensitive)) {
 				continue;
 			}
 
-			fname = talloc_asprintf(ctx, "%s/%s",
-					directory,
-					dname);
-			if (!fname) {
-				return NT_STATUS_NO_MEMORY;
+			TALLOC_FREE(smb_fname->base_name);
+			smb_fname->base_name =
+			    talloc_asprintf(smb_fname, "%s/%s",
+					    fname_dir, dname);
+
+			if (!smb_fname->base_name) {
+				TALLOC_FREE(dir_hnd);
+				status = NT_STATUS_NO_MEMORY;
+				goto out;
 			}
 
-			status = check_name(conn, fname);
+			status = check_name(conn, smb_fname->base_name);
 			if (!NT_STATUS_IS_OK(status)) {
 				TALLOC_FREE(dir_hnd);
-				return status;
+				goto out;
 			}
 
-			status = do_unlink(conn, req, fname, dirtype);
+			status = do_unlink(conn, req, smb_fname, dirtype);
 			if (!NT_STATUS_IS_OK(status)) {
-				TALLOC_FREE(fname);
 				continue;
 			}
 
 			count++;
 			DEBUG(3,("unlink_internals: successful unlink [%s]\n",
-				 fname));
-
-			TALLOC_FREE(fname);
+				 smb_fname->base_name));
 		}
 		TALLOC_FREE(dir_hnd);
 	}
@@ -2682,6 +2715,10 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
 		status = map_nt_error_from_unix(errno);
 	}
 
+ out:
+	TALLOC_FREE(smb_fname);
+	TALLOC_FREE(fname_dir);
+	TALLOC_FREE(fname_mask);
 	return status;
 }
 
@@ -5989,13 +6026,10 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 			bool dest_has_wild,
 			uint32_t access_mask)
 {
-	struct smb_filename *smb_fname = NULL;
-	struct smb_filename *smb_fname_new = NULL;
-	char *directory = NULL;
-	char *mask = NULL;
-	char *name = NULL;
-	char *newname = NULL;
-	char *p;
+	struct smb_filename *smb_fname_src = NULL;
+	struct smb_filename *smb_fname_dst = NULL;
+	char *fname_src_dir = NULL;
+	char *fname_src_mask = NULL;
 	int count=0;
 	NTSTATUS status = NT_STATUS_OK;
 	struct smb_Dir *dir_hnd = NULL;
@@ -6004,29 +6038,19 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 	int create_options = 0;
 	bool posix_pathnames = lp_posix_pathnames();
 
-	status = unix_convert(ctx, conn, name_in, &smb_fname,
+	status = unix_convert(ctx, conn, name_in, &smb_fname_src,
 			      src_has_wild ? UCF_ALLOW_WCARD_LCOMP : 0);
 	if (!NT_STATUS_IS_OK(status)) {
 		goto out;
 	}
 
-	status = get_full_smb_filename(ctx, smb_fname, &name);
-	if (!NT_STATUS_IS_OK(status)) {
-		goto out;
-	}
-
-	status = unix_convert(ctx, conn, newname_in, &smb_fname_new,
+	status = unix_convert(ctx, conn, newname_in, &smb_fname_dst,
 			      (UCF_SAVE_LCOMP |
 			       (dest_has_wild ? UCF_ALLOW_WCARD_LCOMP : 0)));
 	if (!NT_STATUS_IS_OK(status)) {
 		goto out;
 	}
 
-	status = get_full_smb_filename(ctx, smb_fname_new, &newname);
-	if (!NT_STATUS_IS_OK(status)) {
-		goto out;
-	}
-
 	/*
 	 * Split the old name into directory and last component
 	 * strings. Note that unix_convert may have stripped off a
@@ -6036,23 +6060,12 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 	 * as this is checked in resolve_wildcards().
 	 */
 
-	p = strrchr_m(name,'/');
-	if (!p) {
-		directory = talloc_strdup(ctx, ".");
-		if (!directory) {
-			status = NT_STATUS_NO_MEMORY;
-			goto out;
-		}
-		mask = name;
-	} else {
-		*p = 0;
-		directory = talloc_strdup(ctx, name);
-		if (!directory) {
-			status = NT_STATUS_NO_MEMORY;
-			goto out;
-		}
-		mask = p+1;
-		*p = '/'; /* Replace needed for exceptional test below. */
+	/* Split up the directory from the filename/mask. */
+	status = split_fname_dir_mask(ctx, smb_fname_src->base_name,
+				      &fname_src_dir, &fname_src_mask);
+	if (!NT_STATUS_IS_OK(status)) {
+		status = NT_STATUS_NO_MEMORY;
+		goto out;
 	}
 
 	/*
@@ -6064,41 +6077,47 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 	 * Tine Smukavec <valentin.smukavec at hermes.si>.
 	 */
 
-	if (!VALID_STAT(smb_fname->st) && mangle_is_mangled(mask, conn->params)) {
+	if (!VALID_STAT(smb_fname_src->st) &&
+	    mangle_is_mangled(fname_src_mask, conn->params)) {
 		char *new_mask = NULL;
-		mangle_lookup_name_from_8_3(ctx,
-					mask,
-					&new_mask,
-					conn->params );
+		mangle_lookup_name_from_8_3(ctx, fname_src_mask, &new_mask,
+					    conn->params);
 		if (new_mask) {
-			mask = new_mask;
+			TALLOC_FREE(fname_src_mask);
+			fname_src_mask = new_mask;
 		}
 	}
 
 	if (!src_has_wild) {
 		files_struct *fsp;
+		char *fname_src = NULL;
+		char *fname_dst = NULL;
 
 		/*
-		 * No wildcards - just process the one file.
+		 * Only one file needs to be renamied. Append the mask back
+		 * onto the directory.
 		 */
-		/* Add a terminating '/' to the directory name. */
-		directory = talloc_asprintf_append(directory,
-				"/%s",
-				mask);
-		if (!directory) {
+		TALLOC_FREE(smb_fname_src->base_name);
+		smb_fname_src->base_name = talloc_asprintf(smb_fname_src,
+							   "%s/%s",
+							   fname_src_dir,
+							   fname_src_mask);
+		if (!smb_fname_src->base_name) {
 			status = NT_STATUS_NO_MEMORY;
 			goto out;
 		}
 
-		/* Ensure newname contains a '/' also */
-		if(strrchr_m(newname,'/') == 0) {
-			newname = talloc_asprintf(ctx,
-						"./%s",
-						newname);
-			if (!newname) {
+		/* Ensure dst fname contains a '/' also */
+		if(strrchr_m(smb_fname_dst->base_name, '/') == 0) {
+			char *tmp;
+			tmp = talloc_asprintf(smb_fname_dst, "./%s",
+					      smb_fname_dst->base_name);
+			if (!tmp) {
 				status = NT_STATUS_NO_MEMORY;
 				goto out;
 			}
+			TALLOC_FREE(smb_fname_dst->base_name);
+			smb_fname_dst->base_name = tmp;
 		}
 
 		DEBUG(3, ("rename_internals: case_sensitive = %d, "
@@ -6106,32 +6125,41 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 			  "directory = %s, newname = %s, "
 			  "last_component_dest = %s\n",
 			  conn->case_sensitive, conn->case_preserve,
-			  conn->short_case_preserve, directory,
-			  newname, smb_fname_new->original_lcomp));
+			  conn->short_case_preserve, smb_fname_src->base_name,
+			  smb_fname_dst->base_name,
+			  smb_fname_dst->original_lcomp));
 
 		/* The dest name still may have wildcards. */
 		if (dest_has_wild) {
-			char *mod_newname = NULL;
-			if (!resolve_wildcards(ctx,
-					directory,newname,&mod_newname)) {
+			char *fname_dst_mod = NULL;
+			if (!resolve_wildcards(smb_fname_dst,
+					       smb_fname_src->base_name,
+					       smb_fname_dst->base_name,
+					       &fname_dst_mod)) {
 				DEBUG(6, ("rename_internals: resolve_wildcards "
-					"%s %s failed\n",
-					directory,
-					newname));
+					  "%s %s failed\n",
+					  smb_fname_src->base_name,
+					  smb_fname_dst->base_name));
 				status = NT_STATUS_NO_MEMORY;
 				goto out;
 			}
-			newname = mod_newname;
+			TALLOC_FREE(smb_fname_dst->base_name);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list