diff options
author | Jeremy Allison <jra@samba.org> | 2010-04-08 20:32:36 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2010-04-08 20:32:36 -0700 |
commit | 358781559526f962c96c1af88cd104946c507d05 (patch) | |
tree | 1bb2624951e6efd8e035b3c19933b676a271ca43 | |
parent | 8126c78c76965fe6158fb8ef426abf256551e725 (diff) | |
download | samba-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.h | 1 | ||||
-rw-r--r-- | source3/smbd/filename.c | 2 | ||||
-rw-r--r-- | source3/smbd/msdfs.c | 3 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 1 |
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)) { |