[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Tue Oct 24 21:33:02 UTC 2017


The branch, master has been updated
       via  7abe56c s3: smbclient: Test we can rename with a name containing.
       via  f81c34c s3: smbclient: Ensure we call client_clean_name() before all operations on remote pathnames.
       via  d4d9d19 s3: client: Add new utility function client_clean_name().
      from  65442e1 ctdb-client: Fix CID 1419820

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


- Log -----------------------------------------------------------------
commit 7abe56ccfa4aba75c5e166a7bd0bb8141c3f258b
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Oct 23 15:40:04 2017 -0700

    s3: smbclient: Test we can rename with a name containing.
    
    Samba always allowed this anyway, but it's a good place
    to ensure we don't regress.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13093
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Tue Oct 24 23:32:58 CEST 2017 on sn-devel-144

commit f81c34c296f87127c6d1e4dd6ea74aa75660885d
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 20 15:09:38 2017 -0700

    s3: smbclient: Ensure we call client_clean_name() before all operations on remote pathnames.
    
    This allows names containing .. components to be resolved on the client side
    before being sent to the server. Relative names work in SMB1 but not in SMB2.
    Fix both client.c and clitar.c
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13093
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit d4d9d1941bdac9993968c34cf928c645e4152fd3
Author: Jeremy Allison <jra at samba.org>
Date:   Sat Oct 21 00:08:08 2017 +0000

    s3: client: Add new utility function client_clean_name().
    
    Correctly canonicalizes a remote pathname removing '..'
    elements before sending to a remote server. '..' elements
    work in SMB1 pathnames, but not in SMB2.
    
    Not yet used.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13093
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

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

Summary of changes:
 source3/client/client.c                   | 235 +++++++++++++++++++++++++++++-
 source3/client/client_proto.h             |   1 +
 source3/client/clitar.c                   |  31 ++++
 source3/script/tests/test_smbclient_s3.sh |  49 +++++++
 4 files changed, 308 insertions(+), 8 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/client/client.c b/source3/client/client.c
index df16496..8f449e8 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -346,6 +346,37 @@ static void normalize_name(char *newdir)
 }
 
 /****************************************************************************
+ Local name cleanup before sending to server. SMB1 allows relative pathnames,
+ but SMB2 does not, so we need to resolve them locally.
+****************************************************************************/
+
+char *client_clean_name(TALLOC_CTX *ctx, const char *name)
+{
+	char *newname = NULL;
+	if (name == NULL) {
+		return NULL;
+	}
+
+	/* First ensure any path separators are correct. */
+	newname = talloc_strdup(ctx, name);
+	if (newname == NULL) {
+		return NULL;
+	}
+	normalize_name(newname);
+
+	/* Now remove any relative (..) path components. */
+	if (cli->requested_posix_capabilities & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
+		newname = unix_clean_name(ctx, newname);
+	} else {
+		newname = clean_name(ctx, newname);
+	}
+	if (newname == NULL) {
+		return NULL;
+	}
+	return newname;
+}
+
+/****************************************************************************
  Change directory - inner section.
 ****************************************************************************/
 
@@ -399,7 +430,7 @@ static int do_cd(const char *new_dir)
 	}
 	client_set_cur_dir(new_cd);
 
-	new_cd = clean_name(ctx, new_cd);
+	new_cd = client_clean_name(ctx, new_cd);
 	client_set_cur_dir(new_cd);
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
@@ -443,7 +474,7 @@ static int do_cd(const char *new_dir)
 			client_set_cur_dir(saved_dir);
 			goto out;
 		}
-		targetpath = clean_name(ctx, targetpath);
+		targetpath = client_clean_name(ctx, targetpath);
 		if (!targetpath) {
 			client_set_cur_dir(saved_dir);
 			goto out;
@@ -953,6 +984,11 @@ static int cmd_dir(void)
 		return 1;
 	}
 
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
+
 	if (showacls) {
 		/* cwd is only used if showacls is on */
 		client_set_cwd(client_get_cur_dir());
@@ -1005,6 +1041,14 @@ static int cmd_du(void)
 	} else {
 		mask = talloc_strdup(ctx, "*");
 	}
+	if (!mask) {
+		return 1;
+	}
+
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	status = do_list(mask, attribute, do_du, recurse, true);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -1201,7 +1245,7 @@ static int cmd_get(void)
 	if (!rname) {
 		return 1;
 	}
-	rname = clean_name(ctx, rname);
+	rname = client_clean_name(ctx, rname);
 	if (!rname) {
 		return 1;
 	}
@@ -1267,6 +1311,10 @@ static NTSTATUS do_mget(struct cli_state *cli_state, struct file_info *finfo,
 		if (!rname) {
 			return NT_STATUS_NO_MEMORY;
 		}
+		rname = client_clean_name(ctx, rname);
+		if (rname == NULL) {
+			return NT_STATUS_NO_MEMORY;
+		}
 		do_get(rname, finfo->name, false);
 		TALLOC_FREE(rname);
 		return NT_STATUS_OK;
@@ -1286,6 +1334,10 @@ static NTSTATUS do_mget(struct cli_state *cli_state, struct file_info *finfo,
 	if (!new_cd) {
 		return NT_STATUS_NO_MEMORY;
 	}
+	new_cd = client_clean_name(ctx, new_cd);
+	if (new_cd == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
 	client_set_cur_dir(new_cd);
 
 	string_replace(finfo->name,'\\','/');
@@ -1316,6 +1368,10 @@ static NTSTATUS do_mget(struct cli_state *cli_state, struct file_info *finfo,
 		return NT_STATUS_NO_MEMORY;
 	}
 
+	mget_mask = client_clean_name(ctx, mget_mask);
+	if (mget_mask == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
 	status = do_list(mget_mask,
 			 (FILE_ATTRIBUTE_SYSTEM
 			  | FILE_ATTRIBUTE_HIDDEN
@@ -1385,7 +1441,7 @@ static int cmd_more(void)
 	if (!rname) {
 		return 1;
 	}
-	rname = clean_name(ctx,rname);
+	rname = client_clean_name(ctx,rname);
 	if (!rname) {
 		return 1;
 	}
@@ -1443,6 +1499,10 @@ static int cmd_mget(void)
 		if (!mget_mask) {
 			return 1;
 		}
+		mget_mask = client_clean_name(ctx, mget_mask);
+		if (mget_mask == NULL) {
+			return 1;
+		}
 		status = do_list(mget_mask, attribute, do_mget, false, true);
 		if (!NT_STATUS_IS_OK(status)) {
 			return 1;
@@ -1461,6 +1521,10 @@ static int cmd_mget(void)
 		if (!mget_mask) {
 			return 1;
 		}
+		mget_mask = client_clean_name(ctx, mget_mask);
+		if (mget_mask == NULL) {
+			return 1;
+		}
 		status = do_list(mget_mask, attribute, do_mget, false, true);
 		if (!NT_STATUS_IS_OK(status)) {
 			return 1;
@@ -1557,6 +1621,10 @@ static int cmd_mkdir(void)
 	if (!mask) {
 		return 1;
 	}
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	if (recurse) {
 		char *ddir = NULL;
@@ -1628,6 +1696,10 @@ static int cmd_altname(void)
 	if (!name) {
 		return 1;
 	}
+	name = client_clean_name(ctx, name);
+	if (name == NULL) {
+		return 1;
+	}
 	do_altname(name);
 	return 0;
 }
@@ -1858,7 +1930,10 @@ static int cmd_allinfo(void)
 	if (!name) {
 		return 1;
 	}
-
+	name = client_clean_name(ctx, name);
+	if (name == NULL) {
+		return 1;
+	}
 	do_allinfo(name);
 
 	return 0;
@@ -2021,7 +2096,7 @@ static int cmd_put(void)
 		return 1;
 	}
 
-	rname = clean_name(ctx, rname);
+	rname = client_clean_name(ctx, rname);
 	if (!rname) {
 		return 1;
 	}
@@ -2230,6 +2305,19 @@ static int cmd_mput(void)
 						break;
 					}
 					normalize_name(rname);
+					{
+						char *tmp_rname =
+							client_clean_name(ctx, rname);
+						if (tmp_rname == NULL) {
+							break;
+						}
+						SAFE_FREE(rname);
+						rname = smb_xstrdup(tmp_rname);
+						TALLOC_FREE(tmp_rname);
+						if (rname == NULL) {
+							break;
+						}
+					}
 					if (!NT_STATUS_IS_OK(cli_chkpath(cli, rname)) &&
 					    !do_mkdir(rname)) {
 						DEBUG (0, ("Unable to make dir, skipping..."));
@@ -2260,6 +2348,18 @@ static int cmd_mput(void)
 
 			normalize_name(rname);
 
+			{
+				char *tmp_rname = client_clean_name(ctx, rname);
+				if (tmp_rname == NULL) {
+					break;
+				}
+				SAFE_FREE(rname);
+				rname = smb_xstrdup(tmp_rname);
+				TALLOC_FREE(tmp_rname);
+				if (rname == NULL) {
+					break;
+				}
+			}
 			do_put(rname, lname, false);
 		}
 		free_file_list(file_list);
@@ -2430,6 +2530,10 @@ static int cmd_del(void)
 	if (!mask) {
 		return 1;
 	}
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	status = do_list(mask,attribute,do_del,false,false);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -2546,6 +2650,10 @@ static int cmd_deltree(void)
 	if (mask == NULL) {
 		return 1;
 	}
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	deltree_list_head = NULL;
 
@@ -2647,6 +2755,10 @@ static int cmd_wdel(void)
 	if (!mask) {
 		return 1;
 	}
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 				cli, mask, &targetcli, &targetname);
@@ -2688,6 +2800,11 @@ static int cmd_open(void)
 		return 1;
 	}
 
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
+
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, mask, &targetcli, &targetname);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -2803,6 +2920,10 @@ static int cmd_posix_open(void)
 	if (!mask) {
 		return 1;
 	}
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) {
 		d_printf("posix_open <filename> 0<mode>\n");
@@ -2858,6 +2979,10 @@ static int cmd_posix_mkdir(void)
 	if (!mask) {
 		return 1;
 	}
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) {
 		d_printf("posix_mkdir <filename> 0<mode>\n");
@@ -2902,6 +3027,10 @@ static int cmd_posix_unlink(void)
 	if (!mask) {
 		return 1;
 	}
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 				cli, mask, &targetcli, &targetname);
@@ -2941,6 +3070,10 @@ static int cmd_posix_rmdir(void)
 	if (!mask) {
 		return 1;
 	}
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, mask, &targetcli, &targetname);
@@ -3243,6 +3376,10 @@ static int cmd_rmdir(void)
 	if (!mask) {
 		return 1;
 	}
+	mask = client_clean_name(ctx, mask);
+	if (mask == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, mask, &targetcli, &targetname);
@@ -3287,6 +3424,10 @@ static int cmd_link(void)
 	if (!oldname) {
 		return 1;
 	}
+	oldname = client_clean_name(ctx, oldname);
+	if (oldname == NULL) {
+		return 1;
+	}
 	newname = talloc_asprintf(ctx,
 			"%s%s",
 			client_get_cur_dir(),
@@ -3294,6 +3435,10 @@ static int cmd_link(void)
 	if (!newname) {
 		return 1;
 	}
+	newname = client_clean_name(ctx, newname);
+	if (newname == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, oldname, &targetcli, &targetname);
@@ -3341,6 +3486,10 @@ static int cmd_readlink(void)
 	if (!name) {
 		return 1;
 	}
+	name = client_clean_name(ctx, name);
+	if (name == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, name, &targetcli, &targetname);
@@ -3395,6 +3544,10 @@ static int cmd_symlink(void)
 		if (!newname) {
 			return 1;
 		}
+		newname = client_clean_name(ctx, newname);
+		if (newname == NULL) {
+			return 1;
+		}
 		/* New name must be present in share namespace. */
 		status = cli_resolve_path(ctx, "",
 				popt_get_cmdline_auth_info(), cli, newname,
@@ -3446,6 +3599,10 @@ static int cmd_chmod(void)
 	if (!src) {
 		return 1;
 	}
+	src = client_clean_name(ctx, src);
+	if (src == NULL) {
+		return 1;
+	}
 
 	mode = (mode_t)strtol(buf, NULL, 8);
 
@@ -3605,6 +3762,10 @@ static int cmd_getfacl(void)
 	if (!src) {
 		return 1;
 	}
+	src = client_clean_name(ctx, src);
+	if (src == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, src, &targetcli, &targetname);
@@ -3773,6 +3934,10 @@ static int cmd_geteas(void)
 	if (!src) {
 		return 1;
 	}
+	src = client_clean_name(ctx, src);
+	if (src == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, src, &targetcli, &targetname);
@@ -3830,6 +3995,10 @@ static int cmd_setea(void)
 	if (!src) {
 		return 1;
 	}
+	src = client_clean_name(ctx, src);
+	if (src == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, src, &targetcli, &targetname);
@@ -3876,6 +4045,10 @@ static int cmd_stat(void)
 	if (!src) {
 		return 1;
 	}
+	src = client_clean_name(ctx, src);
+	if (src == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, src, &targetcli, &targetname);
@@ -3985,6 +4158,10 @@ static int cmd_chown(void)
 	if (!src) {
 		return 1;
 	}
+	src = client_clean_name(ctx, src);
+	if (src == NULL) {
+		return 1;
+	}
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, src, &targetcli, &targetname);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -4035,6 +4212,10 @@ static int cmd_rename(void)
 	if (!src) {
 		return 1;
 	}
+	src = client_clean_name(ctx, src);
+	if (src == NULL) {
+		return 1;
+	}
 
 	dest = talloc_asprintf(ctx,
 			"%s%s",
@@ -4043,6 +4224,10 @@ static int cmd_rename(void)
 	if (!dest) {
 		return 1;
 	}
+	dest = client_clean_name(ctx, dest);
+	if (dest == NULL) {
+		return 1;
+	}
 
 	if (next_token_talloc(ctx, &cmd_ptr, &buf, NULL) &&
 	    strcsequal(buf, "-f")) {
@@ -4128,6 +4313,10 @@ static int cmd_scopy(void)
 	if (!src) {
 		return 1;
 	}
+	src = client_clean_name(ctx, src);
+	if (src == NULL) {
+		return 1;
+	}
 
 	dest = talloc_asprintf(ctx,
 			"%s%s",
@@ -4136,6 +4325,10 @@ static int cmd_scopy(void)
 	if (!dest) {
 		return 1;
 	}
+	dest = client_clean_name(ctx, dest);
+	if (dest == NULL) {
+		return 1;
+	}
 
 	status = cli_resolve_path(ctx, "", popt_get_cmdline_auth_info(),
 			cli, src, &targetcli, &targetsrc);
@@ -4258,6 +4451,10 @@ static int cmd_hardlink(void)
 	if (!src) {
 		return 1;
 	}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list