summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2010-04-08 20:32:36 -0700
committerJeremy Allison <jra@samba.org>2010-04-08 20:32:36 -0700
commit358781559526f962c96c1af88cd104946c507d05 (patch)
tree1bb2624951e6efd8e035b3c19933b676a271ca43
parent8126c78c76965fe6158fb8ef426abf256551e725 (diff)
downloadsamba-358781559526f962c96c1af88cd104946c507d05.tar.gz
samba-358781559526f962c96c1af88cd104946c507d05.tar.bz2
samba-358781559526f962c96c1af88cd104946c507d05.zip
Fix bug #7339 - MSDFS is non-functional in 3.5.x
In the refactoring around filename_convert, the split between the functions resolve_dfspath() and resolve_dfspath_wcard() was lost, leaving us only with resolve_dfspath_wcard(). Internally resolve_dfspath_wcard() calls dfs_redirect() only with a "allow_wcards" flag of true, wheras the old resolve_dfspath() would call with a value of false. The loss of this case causes dfs_redirect to always masquerade DFS links as directories, even when they are being queried directly by a trans2 QPATHINFO call. We should only masquerade DFS links as directories when called from a SMBsearch or trans2 findfirst/findnext - which was the intent of the "allow_wcards" flag. This patch adds back an allow_wcards bool parameter to resolve_dfspath_wcard(). This bool is set from the state of the ucf_flags when filename_convert() is called. I will follow this up with a new smbclient-based torture test that will prevent us from ever regressing our DFS support again. Jeremy.
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/smbd/filename.c2
-rw-r--r--source3/smbd/msdfs.c3
-rw-r--r--source3/smbd/trans2.c1
4 files changed, 6 insertions, 1 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 7dcdeacb00..a3435a8430 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -6485,6 +6485,7 @@ NTSTATUS resolve_dfspath_wcard(TALLOC_CTX *ctx,
connection_struct *conn,
bool dfs_pathnames,
const char *name_in,
+ bool allow_wcards,
char **pp_name_out,
bool *ppath_contains_wcard);
NTSTATUS create_conn_struct(TALLOC_CTX *ctx,
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index ab79dfd926..154d34a4c0 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -1125,6 +1125,7 @@ NTSTATUS filename_convert(TALLOC_CTX *ctx,
struct smb_filename **pp_smb_fname)
{
NTSTATUS status;
+ bool allow_wcards = (ucf_flags & (UCF_COND_ALLOW_WCARD_LCOMP|UCF_ALWAYS_ALLOW_WCARD_LCOMP));
char *fname = NULL;
*pp_smb_fname = NULL;
@@ -1132,6 +1133,7 @@ NTSTATUS filename_convert(TALLOC_CTX *ctx,
status = resolve_dfspath_wcard(ctx, conn,
dfs_path,
name_in,
+ allow_wcards,
&fname,
ppath_contains_wcard);
if (!NT_STATUS_IS_OK(status)) {
diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c
index dcef75e094..6dfa88692e 100644
--- a/source3/smbd/msdfs.c
+++ b/source3/smbd/msdfs.c
@@ -1738,6 +1738,7 @@ NTSTATUS resolve_dfspath_wcard(TALLOC_CTX *ctx,
connection_struct *conn,
bool dfs_pathnames,
const char *name_in,
+ bool allow_wcards,
char **pp_name_out,
bool *ppath_contains_wcard)
{
@@ -1748,7 +1749,7 @@ NTSTATUS resolve_dfspath_wcard(TALLOC_CTX *ctx,
status = dfs_redirect(ctx,
conn,
name_in,
- True,
+ allow_wcards,
pp_name_out,
&path_contains_wcard);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 0ee9be32b2..06b454ab39 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -6038,6 +6038,7 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
status = resolve_dfspath_wcard(ctx, conn,
req->flags2 & FLAGS2_DFS_PATHNAMES,
newname,
+ true,
&newname,
&dest_has_wcard);
if (!NT_STATUS_IS_OK(status)) {