[PATCH] pathname cleanups

Jeremy Allison jra at samba.org
Fri May 19 03:40:57 UTC 2017


I'm getting ready to move the @GMT snapshot
name handling into struct smb_filename to
clean up a lot of the shadow_copy2 code.

Here are some prerequisite patches that
clean up our handling of the SMB1 FLAGS2
header value and remove some unneeded
bool parameters to functions.

The changes are already tested by the
current pathname tests.

Passes full make test locally.

Please review and push if happy !

Cheers,

	Jeremy.
-------------- next part --------------
>From c3b32fde4e6630c36f4e887e704a92322b111fed Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 11:34:33 -0700
Subject: [PATCH 01/11] s3: smbd: Remove bool dfs_pathnames paramter from
 resolve_dfspath_wcard().

Start cleaning up the pathname parsing to move flags2 checks into UCF_FLAGS
function.

NB. This now only sets *ppath_contains_wcard inside resolve_dfspath_wcard()
if dfs_redirect() sets path_contains_wcard to true, which is a change
from the previous code which could potentially set *ppath_contains_wcard
to an uninitialized value if dfs_redirect() returned without setting
path_contains_wcard.

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/filename.c | 19 +++++++++++--------
 source3/smbd/msdfs.c    | 34 +++++++++++++---------------------
 source3/smbd/proto.h    |  1 -
 source3/smbd/trans2.c   |  9 +++++----
 4 files changed, 29 insertions(+), 34 deletions(-)

diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 2d85e8de0b5..174f0b057a6 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -1550,19 +1550,22 @@ static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 
 	*pp_smb_fname = NULL;
 
-	status = resolve_dfspath_wcard(ctx, conn,
-				dfs_path,
+	if (dfs_path) {
+		status = resolve_dfspath_wcard(ctx, conn,
 				name_in,
 				ucf_flags,
 				!conn->sconn->using_smb2,
 				&fname,
 				ppath_contains_wcard);
-	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(10,("filename_convert_internal: resolve_dfspath failed "
-			"for name %s with %s\n",
-			name_in,
-			nt_errstr(status) ));
-		return status;
+		if (!NT_STATUS_IS_OK(status)) {
+			DEBUG(10,("filename_convert_internal: resolve_dfspath "
+				"failed for name %s with %s\n",
+				name_in,
+				nt_errstr(status) ));
+			return status;
+		}
+	} else {
+		fname = discard_const_p(char, name_in);
 	}
 
 	if (is_fake_file_path(name_in)) {
diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c
index 61538cec832..c22cd1e77b8 100644
--- a/source3/smbd/msdfs.c
+++ b/source3/smbd/msdfs.c
@@ -1669,35 +1669,27 @@ struct junction_map *enum_msdfs_links(TALLOC_CTX *ctx, size_t *p_num_jn)
 
 NTSTATUS resolve_dfspath_wcard(TALLOC_CTX *ctx,
 				connection_struct *conn,
-				bool dfs_pathnames,
 				const char *name_in,
 				uint32_t ucf_flags,
 				bool allow_broken_path,
 				char **pp_name_out,
 				bool *ppath_contains_wcard)
 {
-	bool path_contains_wcard;
+	bool path_contains_wcard = false;
 	NTSTATUS status = NT_STATUS_OK;
 
-	if (dfs_pathnames) {
-		status = dfs_redirect(ctx,
-					conn,
-					name_in,
-					ucf_flags,
-					allow_broken_path,
-					pp_name_out,
-					&path_contains_wcard);
-
-		if (NT_STATUS_IS_OK(status) && ppath_contains_wcard != NULL) {
-			*ppath_contains_wcard = path_contains_wcard;
-		}
-	} else {
-		/*
-		 * Cheat and just return a copy of the in ptr.
-		 * Once srvstr_get_path() uses talloc it'll
-		 * be a talloced ptr anyway.
-		 */
-		*pp_name_out = discard_const_p(char, name_in);
+	status = dfs_redirect(ctx,
+				conn,
+				name_in,
+				ucf_flags,
+				allow_broken_path,
+				pp_name_out,
+				&path_contains_wcard);
+
+	if (NT_STATUS_IS_OK(status) &&
+				ppath_contains_wcard != NULL &&
+				path_contains_wcard) {
+		*ppath_contains_wcard = path_contains_wcard;
 	}
 	return status;
 }
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 19abf7e0449..770c3c24994 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -490,7 +490,6 @@ bool remove_msdfs_link(const struct junction_map *jucn);
 struct junction_map *enum_msdfs_links(TALLOC_CTX *ctx, size_t *p_num_jn);
 NTSTATUS resolve_dfspath_wcard(TALLOC_CTX *ctx,
 				connection_struct *conn,
-				bool dfs_pathnames,
 				const char *name_in,
 				uint32_t ucf_flags,
 				bool allow_broken_path,
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 01df2ee0d86..14f60521099 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -6968,15 +6968,16 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
 	DEBUG(10,("smb_file_rename_information: got name |%s|\n",
 				newname));
 
-	status = resolve_dfspath_wcard(ctx, conn,
-				       req->flags2 & FLAGS2_DFS_PATHNAMES,
+	if (req->flags2 & FLAGS2_DFS_PATHNAMES) {
+		status = resolve_dfspath_wcard(ctx, conn,
 				       newname,
 				       UCF_COND_ALLOW_WCARD_LCOMP,
 				       !conn->sconn->using_smb2,
 				       &newname,
 				       &dest_has_wcard);
-	if (!NT_STATUS_IS_OK(status)) {
-		return status;
+		if (!NT_STATUS_IS_OK(status)) {
+			return status;
+		}
 	}
 
 	/* Check the new name has no '/' characters. */
-- 
2.13.0.303.g4ebf302169-goog


>From 3675a9b2db2dc881196351b48bfe0644e61f652d Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 11:36:56 -0700
Subject: [PATCH 02/11] s3: smbd: Remove ugly use of discard_const that
 previously was hidden in resolve_dfspath_wcard().

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/filename.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 174f0b057a6..49646d40112 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -1546,11 +1546,11 @@ static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 				struct smb_filename **pp_smb_fname)
 {
 	NTSTATUS status;
-	char *fname = NULL;
 
 	*pp_smb_fname = NULL;
 
 	if (dfs_path) {
+		char *fname = NULL;
 		status = resolve_dfspath_wcard(ctx, conn,
 				name_in,
 				ucf_flags,
@@ -1564,8 +1564,7 @@ static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 				nt_errstr(status) ));
 			return status;
 		}
-	} else {
-		fname = discard_const_p(char, name_in);
+		name_in = fname;
 	}
 
 	if (is_fake_file_path(name_in)) {
@@ -1591,11 +1590,11 @@ static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 		ucf_flags |= UCF_ALWAYS_ALLOW_WCARD_LCOMP;
 	}
 
-	status = unix_convert(ctx, conn, fname, pp_smb_fname, ucf_flags);
+	status = unix_convert(ctx, conn, name_in, pp_smb_fname, ucf_flags);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(10,("filename_convert_internal: unix_convert failed "
 			"for name %s with %s\n",
-			fname,
+			name_in,
 			nt_errstr(status) ));
 		return status;
 	}
-- 
2.13.0.303.g4ebf302169-goog


>From 9eab54720951943282b7eb825093ce94cbe437e0 Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 11:41:10 -0700
Subject: [PATCH 03/11] s3: smbd: Make it clear we only overwrite
 *ppath_contains_wcard if resolve_dfspath_wcard() detected a wildcard.

The API for this function specifies that *ppath_contains_wcard
must already have been initialized on entry to filename_convert()
(not a great design, but that's the way it is currently).

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/filename.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 49646d40112..36717a6e60c 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -1550,13 +1550,14 @@ static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 	*pp_smb_fname = NULL;
 
 	if (dfs_path) {
+		bool path_contains_wcard = false;
 		char *fname = NULL;
 		status = resolve_dfspath_wcard(ctx, conn,
 				name_in,
 				ucf_flags,
 				!conn->sconn->using_smb2,
 				&fname,
-				ppath_contains_wcard);
+				&path_contains_wcard);
 		if (!NT_STATUS_IS_OK(status)) {
 			DEBUG(10,("filename_convert_internal: resolve_dfspath "
 				"failed for name %s with %s\n",
@@ -1565,6 +1566,9 @@ static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 			return status;
 		}
 		name_in = fname;
+		if (ppath_contains_wcard != NULL && path_contains_wcard) {
+			*ppath_contains_wcard = path_contains_wcard;
+		}
 	}
 
 	if (is_fake_file_path(name_in)) {
-- 
2.13.0.303.g4ebf302169-goog


>From 2130abfa2b83ebab9443e68c7292ba3aab847b49 Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 11:56:39 -0700
Subject: [PATCH 04/11] s3: smbd: Split out ucf_flags_from_smb_request() from
 filename_create_ucf_flags().

We will use this elsewhere in later commits.

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/filename.c | 11 ++++++++++-
 source3/smbd/proto.h    |  1 +
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 36717a6e60c..b334816f134 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -30,7 +30,7 @@
 #include "smbd/smbd.h"
 #include "smbd/globals.h"
 
-uint32_t filename_create_ucf_flags(struct smb_request *req, uint32_t create_disposition)
+uint32_t ucf_flags_from_smb_request(struct smb_request *req)
 {
 	uint32_t ucf_flags = 0;
 
@@ -38,6 +38,15 @@ uint32_t filename_create_ucf_flags(struct smb_request *req, uint32_t create_disp
 		ucf_flags |= UCF_POSIX_PATHNAMES;
 	}
 
+	return ucf_flags;
+}
+
+uint32_t filename_create_ucf_flags(struct smb_request *req, uint32_t create_disposition)
+{
+	uint32_t ucf_flags = 0;
+
+	ucf_flags |= ucf_flags_from_smb_request(req);
+
 	switch (create_disposition) {
 	case FILE_OPEN:
 	case FILE_OVERWRITE:
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 770c3c24994..65994364b08 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -338,6 +338,7 @@ int fsp_stat(files_struct *fsp);
 
 /* The following definitions come from smbd/filename.c  */
 
+uint32_t ucf_flags_from_smb_request(struct smb_request *req);
 uint32_t filename_create_ucf_flags(struct smb_request *req, uint32_t create_disposition);
 NTSTATUS unix_convert(TALLOC_CTX *ctx,
 		      connection_struct *conn,
-- 
2.13.0.303.g4ebf302169-goog


>From 70105467fdd7ecd1b5322bc052b8109ade050913 Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 12:08:00 -0700
Subject: [PATCH 05/11] s3: smbd: Always use ucf_flags_from_smb_request() in
 place of checking by hand (in most cases).

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/nttrans.c |  4 ++--
 source3/smbd/open.c    |  3 +--
 source3/smbd/reply.c   | 32 +++++++++++++++++---------------
 source3/smbd/trans2.c  | 18 ++++++++----------
 4 files changed, 28 insertions(+), 29 deletions(-)

diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index a5fc62536e7..55e08146a57 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -1573,8 +1573,8 @@ void reply_ntrename(struct smb_request *req)
 	bool src_has_wcard = False;
 	bool dest_has_wcard = False;
 	uint32_t attrs;
-	uint32_t ucf_flags_src = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
-	uint32_t ucf_flags_dst = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+	uint32_t ucf_flags_src = ucf_flags_from_smb_request(req);
+	uint32_t ucf_flags_dst = ucf_flags_from_smb_request(req);
 	uint16_t rename_type;
 	TALLOC_CTX *ctx = talloc_tos();
 	bool stream_rename = false;
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 50f8a5ea216..c484f5177f7 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -5366,8 +5366,7 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
 	files_struct *dir_fsp;
 	char *parent_fname = NULL;
 	char *new_base_name = NULL;
-	uint32_t ucf_flags = ((req != NULL && req->posix_pathnames) ?
-			UCF_POSIX_PATHNAMES : 0);
+	uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 	NTSTATUS status;
 
 	if (root_dir_fid == 0 || !smb_fname) {
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 030f0111576..c6b5b620179 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1278,7 +1278,7 @@ void reply_checkpath(struct smb_request *req)
 	struct smb_filename *smb_fname = NULL;
 	char *name = NULL;
 	NTSTATUS status;
-	uint32_t ucf_flags = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+	uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 	TALLOC_CTX *ctx = talloc_tos();
 
 	START_PROFILE(SMBcheckpath);
@@ -1393,8 +1393,7 @@ void reply_getatr(struct smb_request *req)
 		size = 0;
 		mtime = 0;
 	} else {
-		uint32_t ucf_flags = (req->posix_pathnames ?
-				UCF_POSIX_PATHNAMES : 0);
+		uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 		status = filename_convert(ctx,
 				conn,
 				req->flags2 & FLAGS2_DFS_PATHNAMES,
@@ -1480,7 +1479,7 @@ void reply_setatr(struct smb_request *req)
 	time_t mtime;
 	const char *p;
 	NTSTATUS status;
-	uint32_t ucf_flags = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+	uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 	TALLOC_CTX *ctx = talloc_tos();
 
 	START_PROFILE(SMBsetatr);
@@ -1798,7 +1797,7 @@ void reply_search(struct smb_request *req)
 	if (status_len == 0) {
 		struct smb_filename *smb_dname = NULL;
 		uint32_t ucf_flags = UCF_ALWAYS_ALLOW_WCARD_LCOMP |
-			(req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+			ucf_flags_from_smb_request(req);
 		nt_status = filename_convert(ctx, conn,
 					     req->flags2 & FLAGS2_DFS_PATHNAMES,
 					     path,
@@ -3220,7 +3219,7 @@ void reply_unlink(struct smb_request *req)
 	NTSTATUS status;
 	bool path_contains_wcard = False;
 	uint32_t ucf_flags = UCF_COND_ALLOW_WCARD_LCOMP |
-			(req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+			ucf_flags_from_smb_request(req);
 	TALLOC_CTX *ctx = talloc_tos();
 
 	START_PROFILE(SMBunlink);
@@ -6210,7 +6209,7 @@ void reply_rmdir(struct smb_request *req)
 	TALLOC_CTX *ctx = talloc_tos();
 	files_struct *fsp = NULL;
 	int info = 0;
-	uint32_t ucf_flags = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+	uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 	struct smbd_server_connection *sconn = req->sconn;
 
 	START_PROFILE(SMBrmdir);
@@ -7294,12 +7293,15 @@ void reply_mv(struct smb_request *req)
 	TALLOC_CTX *ctx = talloc_tos();
 	struct smb_filename *smb_fname_src = NULL;
 	struct smb_filename *smb_fname_dst = NULL;
-	uint32_t src_ucf_flags = (req->posix_pathnames ?
-		(UCF_UNIX_NAME_LOOKUP|UCF_POSIX_PATHNAMES) :
-		UCF_COND_ALLOW_WCARD_LCOMP);
-	uint32_t dst_ucf_flags = UCF_SAVE_LCOMP |
-		(req->posix_pathnames ? UCF_POSIX_PATHNAMES :
-		 UCF_COND_ALLOW_WCARD_LCOMP);
+	uint32_t src_ucf_flags = ucf_flags_from_smb_request(req) |
+		(req->posix_pathnames ?
+			UCF_UNIX_NAME_LOOKUP :
+			UCF_COND_ALLOW_WCARD_LCOMP);
+	uint32_t dst_ucf_flags = ucf_flags_from_smb_request(req) |
+		UCF_SAVE_LCOMP |
+		(req->posix_pathnames ?
+			0 :
+			UCF_COND_ALLOW_WCARD_LCOMP);
 	bool stream_rename = false;
 
 	START_PROFILE(SMBmv);
@@ -7612,9 +7614,9 @@ void reply_copy(struct smb_request *req)
 	bool dest_has_wild = False;
 	NTSTATUS status;
 	uint32_t ucf_flags_src = UCF_COND_ALLOW_WCARD_LCOMP |
-		(req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+		ucf_flags_from_smb_request(req);
 	uint32_t ucf_flags_dst = UCF_COND_ALLOW_WCARD_LCOMP |
-		(req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+		ucf_flags_from_smb_request(req);
 	TALLOC_CTX *ctx = talloc_tos();
 
 	START_PROFILE(SMBcopy);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 14f60521099..9f8689290c1 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -1225,7 +1225,7 @@ static void call_trans2open(connection_struct *conn,
 	uint32_t create_disposition;
 	uint32_t create_options = 0;
 	uint32_t private_flags = 0;
-	uint32_t ucf_flags = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+	uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 	TALLOC_CTX *ctx = talloc_tos();
 
 	/*
@@ -2637,7 +2637,7 @@ static void call_trans2findfirst(connection_struct *conn,
 	struct dptr_struct *dirptr = NULL;
 	struct smbd_server_connection *sconn = req->sconn;
 	uint32_t ucf_flags = UCF_SAVE_LCOMP | UCF_ALWAYS_ALLOW_WCARD_LCOMP |
-			(req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+			ucf_flags_from_smb_request(req);
 	bool backup_priv = false;
 	bool as_root = false;
 
@@ -5800,8 +5800,7 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
 	} else {
 		uint32_t name_hash;
 		char *fname = NULL;
-		uint32_t ucf_flags = (req->posix_pathnames ?
-				UCF_POSIX_PATHNAMES : 0);
+		uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 
 		/* qpathinfo */
 		if (total_params < 7) {
@@ -6654,7 +6653,7 @@ static NTSTATUS smb_set_file_unix_hlink(connection_struct *conn,
 {
 	char *oldname = NULL;
 	struct smb_filename *smb_fname_old = NULL;
-	uint32_t ucf_flags = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+	uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 	TALLOC_CTX *ctx = talloc_tos();
 	NTSTATUS status = NT_STATUS_OK;
 
@@ -6720,7 +6719,7 @@ static NTSTATUS smb2_file_rename_information(connection_struct *conn,
 	char *newname = NULL;
 	struct smb_filename *smb_fname_dst = NULL;
 	uint32_t ucf_flags = UCF_SAVE_LCOMP |
-		(req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+		ucf_flags_from_smb_request(req);
 	NTSTATUS status = NT_STATUS_OK;
 	TALLOC_CTX *ctx = talloc_tos();
 
@@ -6832,7 +6831,7 @@ static NTSTATUS smb_file_link_information(connection_struct *conn,
 	struct smb_filename *smb_fname_dst = NULL;
 	NTSTATUS status = NT_STATUS_OK;
 	uint32_t ucf_flags = UCF_SAVE_LCOMP |
-		(req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+		ucf_flags_from_smb_request(req);
 	TALLOC_CTX *ctx = talloc_tos();
 
 	if (!fsp) {
@@ -8790,8 +8789,7 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
 		}
 	} else {
 		char *fname = NULL;
-		uint32_t ucf_flags = (req->posix_pathnames ?
-			UCF_POSIX_PATHNAMES : 0);
+		uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 
 		/* set path info */
 		if (total_params < 7) {
@@ -8941,7 +8939,7 @@ static void call_trans2mkdir(connection_struct *conn, struct smb_request *req,
 	char *directory = NULL;
 	NTSTATUS status = NT_STATUS_OK;
 	struct ea_list *ea_list = NULL;
-	uint32_t ucf_flags = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0);
+	uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 	TALLOC_CTX *ctx = talloc_tos();
 
 	if (!CAN_WRITE(conn)) {
-- 
2.13.0.303.g4ebf302169-goog


>From 2c9f8cb3c149f313a73fbcace1831e760b18072e Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 12:08:57 -0700
Subject: [PATCH 06/11] s3: smbd: In ntrename OR in ucf_flags, don't overwrite.

This isn't worth a bug backport as right now the only flag that
could be overwritten is the UCF_POSIX_PATHNAMES flag, and for
a POSIX connection the client will use posix rename, not an
ntrename.

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/nttrans.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index 55e08146a57..31870b941ec 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -1627,8 +1627,8 @@ void reply_ntrename(struct smb_request *req)
 	 * destination's last component.
 	 */
 	if (rename_type == RENAME_FLAG_RENAME) {
-		ucf_flags_src = UCF_COND_ALLOW_WCARD_LCOMP;
-		ucf_flags_dst = UCF_COND_ALLOW_WCARD_LCOMP | UCF_SAVE_LCOMP;
+		ucf_flags_src |= UCF_COND_ALLOW_WCARD_LCOMP;
+		ucf_flags_dst |= UCF_COND_ALLOW_WCARD_LCOMP | UCF_SAVE_LCOMP;
 	}
 
 	/* rename_internals() calls unix_convert(), so don't call it here. */
-- 
2.13.0.303.g4ebf302169-goog


>From 40011f73bcb8a3b101bf5389b2fd0c6e9a24cc7d Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 12:18:58 -0700
Subject: [PATCH 07/11] s3: smbd: Add UCF_DFS_PATHNAME which tracks the flags2
 FLAGS2_DFS_PATHNAMES bit.

Set inside ucf_flags_from_smb_request(). This will allow us to
remove the req->flags2 & FLAGS2_DFS_PATHNAMES parameter from
filename_convert().

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/filename.c | 9 +++++++--
 source3/smbd/smbd.h     | 5 +++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index b334816f134..cb0ce57df28 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -34,8 +34,13 @@ uint32_t ucf_flags_from_smb_request(struct smb_request *req)
 {
 	uint32_t ucf_flags = 0;
 
-	if (req != NULL && req->posix_pathnames) {
-		ucf_flags |= UCF_POSIX_PATHNAMES;
+	if (req != NULL) {
+		if (req->posix_pathnames) {
+			ucf_flags |= UCF_POSIX_PATHNAMES;
+		}
+		if (req->flags2 & FLAGS2_DFS_PATHNAMES) {
+			ucf_flags |= UCF_DFS_PATHNAME;
+		}
 	}
 
 	return ucf_flags;
diff --git a/source3/smbd/smbd.h b/source3/smbd/smbd.h
index e147bad3f7c..d372c7ed771 100644
--- a/source3/smbd/smbd.h
+++ b/source3/smbd/smbd.h
@@ -74,5 +74,10 @@ struct trans_state {
 #define UCF_POSIX_PATHNAMES		0x00000008
 #define UCF_UNIX_NAME_LOOKUP		0x00000010
 #define UCF_PREP_CREATEFILE		0x00000020
+/*
+ * Use the same bit as FLAGS2_DFS_PATHNAMES
+ * which means the same thing.
+ */
+#define UCF_DFS_PATHNAME		0x00001000
 
 #endif /* _SMBD_SMBD_H */
-- 
2.13.0.303.g4ebf302169-goog


>From 1622b49f91bf7b1ad86a83215edba669e974aba2 Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 12:29:50 -0700
Subject: [PATCH 08/11] s3: smbd: We can now remove the 'bool dfs_path'
 parameter from filename_convert().

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/rpc_server/srvsvc/srv_srvsvc_nt.c |  2 --
 source3/smbd/filename.c                   |  8 ++------
 source3/smbd/nttrans.c                    |  4 ----
 source3/smbd/open.c                       |  1 -
 source3/smbd/proto.h                      |  1 -
 source3/smbd/reply.c                      | 15 ---------------
 source3/smbd/smb2_create.c                |  3 +--
 source3/smbd/smb2_query_directory.c       |  1 -
 source3/smbd/trans2.c                     |  8 --------
 9 files changed, 3 insertions(+), 40 deletions(-)

diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
index 513ef17c903..fdf42ea030b 100644
--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
@@ -2358,7 +2358,6 @@ WERROR _srvsvc_NetGetFileSecurity(struct pipes_struct *p,
 
 	nt_status = filename_convert(talloc_tos(),
 					conn,
-					false,
 					r->in.file,
 					ucf_flags,
 					NULL,
@@ -2508,7 +2507,6 @@ WERROR _srvsvc_NetSetFileSecurity(struct pipes_struct *p,
 
 	nt_status = filename_convert(talloc_tos(),
 					conn,
-					false,
 					r->in.file,
 					ucf_flags,
 					NULL,
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index cb0ce57df28..9586857da0b 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -1535,7 +1535,6 @@ static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx,
  *
  * @param ctx		talloc_ctx to allocate memory with.
  * @param conn		connection struct for vfs calls.
- * @param dfs_path	Whether this path requires dfs resolution.
  * @param smbreq	SMB request if we're using privileges.
  * @param name_in	The unconverted name.
  * @param ucf_flags	flags to pass through to unix_convert().
@@ -1552,7 +1551,6 @@ static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx,
  */
 static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 				connection_struct *conn,
-				bool dfs_path,
 				struct smb_request *smbreq,
 				const char *name_in,
 				uint32_t ucf_flags,
@@ -1563,7 +1561,7 @@ static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 
 	*pp_smb_fname = NULL;
 
-	if (dfs_path) {
+	if (ucf_flags & UCF_DFS_PATHNAME) {
 		bool path_contains_wcard = false;
 		char *fname = NULL;
 		status = resolve_dfspath_wcard(ctx, conn,
@@ -1583,6 +1581,7 @@ static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 		if (ppath_contains_wcard != NULL && path_contains_wcard) {
 			*ppath_contains_wcard = path_contains_wcard;
 		}
+		ucf_flags &= ~UCF_DFS_PATHNAME;
 	}
 
 	if (is_fake_file_path(name_in)) {
@@ -1647,7 +1646,6 @@ static NTSTATUS filename_convert_internal(TALLOC_CTX *ctx,
 
 NTSTATUS filename_convert(TALLOC_CTX *ctx,
 				connection_struct *conn,
-				bool dfs_path,
 				const char *name_in,
 				uint32_t ucf_flags,
 				bool *ppath_contains_wcard,
@@ -1655,7 +1653,6 @@ NTSTATUS filename_convert(TALLOC_CTX *ctx,
 {
 	return filename_convert_internal(ctx,
 					conn,
-					dfs_path,
 					NULL,
 					name_in,
 					ucf_flags,
@@ -1678,7 +1675,6 @@ NTSTATUS filename_convert_with_privilege(TALLOC_CTX *ctx,
 {
 	return filename_convert_internal(ctx,
 					conn,
-					smbreq->flags2 & FLAGS2_DFS_PATHNAMES,
 					smbreq,
 					name_in,
 					ucf_flags,
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index 31870b941ec..7b7f2056099 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -538,7 +538,6 @@ void reply_ntcreate_and_X(struct smb_request *req)
 	ucf_flags = filename_create_ucf_flags(req, create_disposition);
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				fname,
 				ucf_flags,
 				NULL,
@@ -1111,7 +1110,6 @@ static void call_nt_transact_create(connection_struct *conn,
 	ucf_flags = filename_create_ucf_flags(req, create_disposition);
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				fname,
 				ucf_flags,
 				NULL,
@@ -1633,7 +1631,6 @@ void reply_ntrename(struct smb_request *req)
 
 	/* rename_internals() calls unix_convert(), so don't call it here. */
 	status = filename_convert(ctx, conn,
-				  req->flags2 & FLAGS2_DFS_PATHNAMES,
 				  oldname,
 				  ucf_flags_src,
 				  NULL,
@@ -1651,7 +1648,6 @@ void reply_ntrename(struct smb_request *req)
 	}
 
 	status = filename_convert(ctx, conn,
-				  req->flags2 & FLAGS2_DFS_PATHNAMES,
 				  newname,
 				  ucf_flags_dst,
 				  &dest_has_wcard,
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index c484f5177f7..49932e98504 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -5459,7 +5459,6 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
 
 	status = filename_convert(req,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				new_base_name,
 				ucf_flags,
 				NULL,
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 65994364b08..0be2a49b4f3 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -351,7 +351,6 @@ int get_real_filename(connection_struct *conn, const char *path,
 		      char **found_name);
 NTSTATUS filename_convert(TALLOC_CTX *mem_ctx,
 			connection_struct *conn,
-			bool dfs_path,
 			const char *name_in,
 			uint32_t ucf_flags,
 			bool *ppath_contains_wcard,
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index c6b5b620179..e6fabad8e00 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1297,7 +1297,6 @@ void reply_checkpath(struct smb_request *req)
 
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				name,
 				ucf_flags,
 				NULL,
@@ -1396,7 +1395,6 @@ void reply_getatr(struct smb_request *req)
 		uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 		status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				fname,
 				ucf_flags,
 				NULL,
@@ -1500,7 +1498,6 @@ void reply_setatr(struct smb_request *req)
 
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				fname,
 				ucf_flags,
 				NULL,
@@ -1799,7 +1796,6 @@ void reply_search(struct smb_request *req)
 		uint32_t ucf_flags = UCF_ALWAYS_ALLOW_WCARD_LCOMP |
 			ucf_flags_from_smb_request(req);
 		nt_status = filename_convert(ctx, conn,
-					     req->flags2 & FLAGS2_DFS_PATHNAMES,
 					     path,
 					     ucf_flags,
 					     &mask_contains_wcard,
@@ -2145,7 +2141,6 @@ void reply_open(struct smb_request *req)
 
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				fname,
 				ucf_flags,
 				NULL,
@@ -2318,7 +2313,6 @@ void reply_open_and_X(struct smb_request *req)
 
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				fname,
 				ucf_flags,
 				NULL,
@@ -2563,7 +2557,6 @@ void reply_mknew(struct smb_request *req)
 	ucf_flags = filename_create_ucf_flags(req, create_disposition);
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				fname,
 				ucf_flags,
 				NULL,
@@ -2700,7 +2693,6 @@ void reply_ctemp(struct smb_request *req)
 
 		ucf_flags = filename_create_ucf_flags(req, FILE_CREATE);
 		status = filename_convert(ctx, conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				fname,
 				ucf_flags,
 				NULL,
@@ -3240,7 +3232,6 @@ void reply_unlink(struct smb_request *req)
 	}
 
 	status = filename_convert(ctx, conn,
-				  req->flags2 & FLAGS2_DFS_PATHNAMES,
 				  name,
 				  ucf_flags,
 				  &path_contains_wcard,
@@ -6151,7 +6142,6 @@ void reply_mkdir(struct smb_request *req)
 
 	ucf_flags = filename_create_ucf_flags(req, FILE_CREATE);
 	status = filename_convert(ctx, conn,
-				 req->flags2 & FLAGS2_DFS_PATHNAMES,
 				 directory,
 				 ucf_flags,
 				 NULL,
@@ -6222,7 +6212,6 @@ void reply_rmdir(struct smb_request *req)
 	}
 
 	status = filename_convert(ctx, conn,
-				 req->flags2 & FLAGS2_DFS_PATHNAMES,
 				 directory,
 				 ucf_flags,
 				 NULL,
@@ -7342,7 +7331,6 @@ void reply_mv(struct smb_request *req)
 
 	status = filename_convert(ctx,
 				  conn,
-				  req->flags2 & FLAGS2_DFS_PATHNAMES,
 				  name,
 				  src_ucf_flags,
 				  &src_has_wcard,
@@ -7360,7 +7348,6 @@ void reply_mv(struct smb_request *req)
 
 	status = filename_convert(ctx,
 				  conn,
-				  req->flags2 & FLAGS2_DFS_PATHNAMES,
 				  newname,
 				  dst_ucf_flags,
 				  &dest_has_wcard,
@@ -7654,7 +7641,6 @@ void reply_copy(struct smb_request *req)
 	}
 
 	status = filename_convert(ctx, conn,
-				  req->flags2 & FLAGS2_DFS_PATHNAMES,
 				  fname_src,
 				  ucf_flags_src,
 				  &source_has_wild,
@@ -7670,7 +7656,6 @@ void reply_copy(struct smb_request *req)
 	}
 
 	status = filename_convert(ctx, conn,
-				  req->flags2 & FLAGS2_DFS_PATHNAMES,
 				  fname_dst,
 				  ucf_flags_dst,
 				  &dest_has_wild,
diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c
index cba0781430e..5a371aeef84 100644
--- a/source3/smbd/smb2_create.c
+++ b/source3/smbd/smb2_create.c
@@ -405,7 +405,7 @@ static NTSTATUS smbd_smb2_create_durable_lease_check(struct smb_request *smb1req
 	}
 
 	ucf_flags = filename_create_ucf_flags(smb1req, FILE_OPEN);
-	status = filename_convert(talloc_tos(), fsp->conn, false,
+	status = filename_convert(talloc_tos(), fsp->conn,
 				  requested_filename, ucf_flags,
 				  NULL, &smb_fname);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -1106,7 +1106,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 			ucf_flags = filename_create_ucf_flags(smb1req, in_create_disposition);
 			status = filename_convert(req,
 						  smb1req->conn,
-						  smb1req->flags2 & FLAGS2_DFS_PATHNAMES,
 						  fname,
 						  ucf_flags,
 						  NULL, /* ppath_contains_wcards */
diff --git a/source3/smbd/smb2_query_directory.c b/source3/smbd/smb2_query_directory.c
index 6b6dae7873a..3e0abdf770a 100644
--- a/source3/smbd/smb2_query_directory.c
+++ b/source3/smbd/smb2_query_directory.c
@@ -392,7 +392,6 @@ static struct tevent_req *smbd_smb2_query_directory_send(TALLOC_CTX *mem_ctx,
 		}
 		status = filename_convert(state,
 				conn,
-				false, /* Not a DFS path. */
 				fullpath,
 				ucf_flags,
 				&wcard_has_wild,
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 9f8689290c1..8fd238ae96c 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -1289,7 +1289,6 @@ static void call_trans2open(connection_struct *conn,
 
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				fname,
 				ucf_flags,
 				NULL,
@@ -2733,7 +2732,6 @@ close_if_end = %d requires_resume_key = %d backup_priv = %d level = 0x%x, max_da
 				&smb_dname);
 	} else {
 		ntstatus = filename_convert(talloc_tos(), conn,
-				    req->flags2 & FLAGS2_DFS_PATHNAMES,
 				    directory,
 				    ucf_flags,
 				    &mask_contains_wcard,
@@ -5851,7 +5849,6 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
 
 		status = filename_convert(req,
 					conn,
-					req->flags2 & FLAGS2_DFS_PATHNAMES,
 					fname,
 					ucf_flags,
 					NULL,
@@ -6690,7 +6687,6 @@ static NTSTATUS smb_set_file_unix_hlink(connection_struct *conn,
 
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				oldname,
 				ucf_flags,
 				NULL,
@@ -6766,7 +6762,6 @@ static NTSTATUS smb2_file_rename_information(connection_struct *conn,
 
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				newname,
 				ucf_flags,
 				NULL,
@@ -6877,7 +6872,6 @@ static NTSTATUS smb_file_link_information(connection_struct *conn,
 
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				newname,
 				ucf_flags,
 				NULL,
@@ -8830,7 +8824,6 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
 		}
 
 		status = filename_convert(req, conn,
-					 req->flags2 & FLAGS2_DFS_PATHNAMES,
 					 fname,
 					 ucf_flags,
 					 NULL,
@@ -8980,7 +8973,6 @@ static void call_trans2mkdir(connection_struct *conn, struct smb_request *req,
 
 	status = filename_convert(ctx,
 				conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
 				directory,
 				ucf_flags,
 				NULL,
-- 
2.13.0.303.g4ebf302169-goog


>From 851c668981b04b886126c18b0faf66c1a7895c78 Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 13:22:36 -0700
Subject: [PATCH 09/11] s3: smbd: Fix up the ucf_flags correctly in
 smb_file_rename_information().

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/trans2.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 8fd238ae96c..5155abb0095 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -7013,6 +7013,12 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
 		 * the newname instead.
 		 */
 		char *base_name = NULL;
+		uint32_t ucf_flags = UCF_SAVE_LCOMP |
+			ucf_flags_from_smb_request(req);
+
+		if (dest_has_wcard) {
+			ucf_flags |= UCF_ALWAYS_ALLOW_WCARD_LCOMP;
+		}
 
 		/* newname must *not* be a stream name. */
 		if (newname[0] == ':') {
@@ -7045,10 +7051,7 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
 		}
 
 		status = unix_convert(ctx, conn, base_name, &smb_fname_dst,
-				      (UCF_SAVE_LCOMP |
-					  (dest_has_wcard ?
-					      UCF_ALWAYS_ALLOW_WCARD_LCOMP :
-					      0)));
+					ucf_flags);
 
 		/* If an error we expect this to be
 		 * NT_STATUS_OBJECT_PATH_NOT_FOUND */
-- 
2.13.0.303.g4ebf302169-goog


>From fd5211634f6441673c49e4ade467d886da742d5e Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 13:24:26 -0700
Subject: [PATCH 10/11] s3: smbd: Add UCF_GMT_PATHNAME, which represents
 FLAGS2_REPARSE_PATH.

This must be set by a client to use shadow copy (@GMT) paths.

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/filename.c    | 3 +++
 source3/smbd/smb2_create.c | 5 +++++
 source3/smbd/smbd.h        | 5 +++++
 3 files changed, 13 insertions(+)

diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 9586857da0b..fbe8eb4b325 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -41,6 +41,9 @@ uint32_t ucf_flags_from_smb_request(struct smb_request *req)
 		if (req->flags2 & FLAGS2_DFS_PATHNAMES) {
 			ucf_flags |= UCF_DFS_PATHNAME;
 		}
+		if (req->flags2 & FLAGS2_REPARSE_PATH) {
+			ucf_flags |= UCF_GMT_PATHNAME;
+		}
 	}
 
 	return ucf_flags;
diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c
index 5a371aeef84..81e081875bc 100644
--- a/source3/smbd/smb2_create.c
+++ b/source3/smbd/smb2_create.c
@@ -925,6 +925,11 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 			if (tevent_req_nomem(fname, req)) {
 				return tevent_req_post(req, ev);
 			}
+			/*
+			 * Tell filename_create_ucf_flags() this
+			 * is an @GMT path.
+			 */
+			smb1req->flags2 |= FLAGS2_REPARSE_PATH;
 		}
 
 		if (qfid) {
diff --git a/source3/smbd/smbd.h b/source3/smbd/smbd.h
index d372c7ed771..a3c372b95b1 100644
--- a/source3/smbd/smbd.h
+++ b/source3/smbd/smbd.h
@@ -75,6 +75,11 @@ struct trans_state {
 #define UCF_UNIX_NAME_LOOKUP		0x00000010
 #define UCF_PREP_CREATEFILE		0x00000020
 /*
+ * Use the same bit as FLAGS2_REPARSE_PATH
+ * which means the same thing.
+ */
+#define UCF_GMT_PATHNAME		0x00000400
+/*
  * Use the same bit as FLAGS2_DFS_PATHNAMES
  * which means the same thing.
  */
-- 
2.13.0.303.g4ebf302169-goog


>From 65f69e368071c0b977a98d06a1f1843e10dddd3d Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 18 May 2017 13:28:23 -0700
Subject: [PATCH 11/11] s3: smbd: Correctly identify a snapshot path using
 UCF_GMT_PATHNAME.

All our client code already does this correctly for @GMT names.

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/filename.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index fbe8eb4b325..084849d4ba1 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -434,6 +434,7 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
 	bool allow_wcard_last_component =
 	    (ucf_flags & UCF_ALWAYS_ALLOW_WCARD_LCOMP);
 	bool save_last_component = ucf_flags & UCF_SAVE_LCOMP;
+	bool snapshot_path = (ucf_flags & UCF_GMT_PATHNAME);
 	NTSTATUS status;
 	int ret = -1;
 
@@ -516,7 +517,7 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
 	}
 
 	/* Canonicalize any @GMT- paths. */
-	if (posix_pathnames == false) {
+	if (snapshot_path) {
 		status = canonicalize_snapshot_path(smb_fname);
 		if (!NT_STATUS_IS_OK(status)) {
 			goto err;
-- 
2.13.0.303.g4ebf302169-goog



More information about the samba-technical mailing list