From a5433c4bf7a256880725173b96af5405c3c2eb9c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 25 Mar 2005 00:58:15 +0000 Subject: [PATCH] r6053: Fixup dfs path with the new wildcard parser code split out. Jeremy. (This used to be commit e831cef618d55c362e8d3a8a4c2b9f2ed7d4d7bd) --- source3/include/msdfs.h | 7 +++++++ source3/smbd/msdfs.c | 39 +++++++++++++++++---------------------- source3/smbd/posix_acls.c | 2 +- source3/smbd/reply.c | 12 ++++++------ source3/smbd/trans2.c | 2 +- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/source3/include/msdfs.h b/source3/include/msdfs.h index 8b365d02ea6..a856f5d1abc 100644 --- a/source3/include/msdfs.h +++ b/source3/include/msdfs.h @@ -72,6 +72,13 @@ struct dfs_path return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, \ ERRSRV, ERRbadpath);; } +#define RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf) \ +{ if ((SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES) && \ + lp_host_msdfs() && lp_msdfs_root(SNUM(conn)) && \ + dfs_redirect(name,conn,True)) \ + return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, \ + ERRSRV, ERRbadpath);; } + #define init_dfsroot(conn, inbuf, outbuf) \ { if (lp_msdfs_root(SNUM(conn)) && lp_host_msdfs()) { \ DEBUG(2,("Serving %s as a Dfs root\n", \ diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index 36baff80224..2e4649efed4 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -75,7 +75,7 @@ static BOOL parse_dfs_path(char* pathname, struct dfs_path* pdp) into the dfs_path structure **********************************************************************/ -static BOOL parse_processed_dfs_path(char* pathname, struct dfs_path* pdp) +static BOOL parse_processed_dfs_path(char* pathname, struct dfs_path* pdp, BOOL allow_wcards) { pstring pathname_local; char* p,*temp; @@ -110,7 +110,11 @@ static BOOL parse_processed_dfs_path(char* pathname, struct dfs_path* pdp) DEBUG(10,("parse_processed_dfs_path: servicename: %s\n",pdp->servicename)); /* rest is reqpath */ - check_path_syntax(pdp->reqpath, p+1); + if (allow_wcards) { + check_path_syntax_wcard(pdp->reqpath, p+1); + } else { + check_path_syntax(pdp->reqpath, p+1); + } DEBUG(10,("parse_processed_dfs_path: rest of the path: %s\n",pdp->reqpath)); return True; @@ -265,9 +269,7 @@ BOOL is_msdfs_link(connection_struct* conn, char * path, Used by other functions to decide if a dfs path is remote, and to get the list of referred locations for that remote path. -findfirst_flag: For findfirsts, dfs links themselves are not -redirected, but paths beyond the links are. For normal smb calls, -even dfs links need to be redirected. +allow_wcards: Should we allow wildcards when parsing paths. self_referralp: clients expect a dfs referral for the same share when they request referrals for dfs roots on a server. @@ -279,7 +281,7 @@ should try the remaining path on the redirected server. static BOOL resolve_dfs_path(pstring dfspath, struct dfs_path* dp, connection_struct* conn, - BOOL findfirst_flag, + BOOL allow_wcards, struct referral** reflistpp, int* refcntp, BOOL* self_referralp, int* consumedcntp) { @@ -311,18 +313,11 @@ static BOOL resolve_dfs_path(pstring dfspath, struct dfs_path* dp, /* check if need to redirect */ if (is_msdfs_link(conn, localpath, reflistpp, refcntp, NULL)) { - if (findfirst_flag) { - DEBUG(6,("resolve_dfs_path (FindFirst) No redirection " - "for dfs link %s.\n", dfspath)); - return False; - } else { - DEBUG(6,("resolve_dfs_path: %s resolves to a valid Dfs link.\n", - dfspath)); - if (consumedcntp) - *consumedcntp = strlen(dfspath); - return True; - } - } + DEBUG(6,("resolve_dfs_path: %s resolves to a valid Dfs link.\n", dfspath)); + if (consumedcntp) + *consumedcntp = strlen(dfspath); + return True; + } /* redirect if any component in the path is a link */ pstrcpy(reqpath, dp->reqpath); @@ -366,15 +361,14 @@ static BOOL resolve_dfs_path(pstring dfspath, struct dfs_path* dp, If not, the pathname is converted to a tcon-relative local unix path *****************************************************************/ -BOOL dfs_redirect(pstring pathname, connection_struct* conn, - BOOL findfirst_flag) +BOOL dfs_redirect(pstring pathname, connection_struct* conn, BOOL allow_wcards) { struct dfs_path dp; if (!conn || !pathname) return False; - parse_processed_dfs_path(pathname, &dp); + parse_processed_dfs_path(pathname, &dp, allow_wcards); /* if dfs pathname for a non-dfs share, convert to tcon-relative path and return false */ @@ -386,7 +380,7 @@ BOOL dfs_redirect(pstring pathname, connection_struct* conn, if (!strequal(dp.servicename, lp_servicename(SNUM(conn)) )) return False; - if (resolve_dfs_path(pathname, &dp, conn, findfirst_flag, + if (resolve_dfs_path(pathname, &dp, conn, allow_wcards, NULL, NULL, NULL, NULL)) { DEBUG(3,("dfs_redirect: Redirecting %s\n", pathname)); return True; @@ -802,6 +796,7 @@ int setup_dfs_referral(connection_struct *orig_conn, char *pathname, int max_ref /********************************************************************** Creates a junction structure from a Dfs pathname **********************************************************************/ + BOOL create_junction(char* pathname, struct junction_map* jucn) { struct dfs_path dp; diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c index c0ccdcb6d63..76b67169f21 100644 --- a/source3/smbd/posix_acls.c +++ b/source3/smbd/posix_acls.c @@ -3067,7 +3067,7 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd) create_file_sids(&sbuf, &file_owner_sid, &file_grp_sid); acl_perms = unpack_canon_ace( fsp, &sbuf, &file_owner_sid, &file_grp_sid, - &file_ace_list, &dir_ace_list, security_info_sent, psd); + &file_ace_list, &dir_ace_list, security_info_sent, psd); /* Ignore W2K traverse DACL set. */ if (file_ace_list || dir_ace_list) { diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 059af830017..17423c531dc 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -949,7 +949,7 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size return ERROR_NT(nt_status); } - RESOLVE_DFSPATH(path, conn, inbuf, outbuf); + RESOLVE_DFSPATH_WCARD(path, conn, inbuf, outbuf); p++; status_len = SVAL(p, 0); @@ -1823,7 +1823,7 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size return ERROR_NT(status); } - RESOLVE_DFSPATH(name, conn, inbuf, outbuf); + RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf); DEBUG(3,("reply_unlink : %s\n",name)); @@ -4293,8 +4293,8 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, return ERROR_NT(status); } - RESOLVE_DFSPATH(name, conn, inbuf, outbuf); - RESOLVE_DFSPATH(newname, conn, inbuf, outbuf); + RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf); + RESOLVE_DFSPATH_WCARD(newname, conn, inbuf, outbuf); DEBUG(3,("reply_mv : %s -> %s\n",name,newname)); @@ -4453,8 +4453,8 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, return ERROR_DOS(ERRSRV,ERRinvdevice); } - RESOLVE_DFSPATH(name, conn, inbuf, outbuf); - RESOLVE_DFSPATH(newname, conn, inbuf, outbuf); + RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf); + RESOLVE_DFSPATH_WCARD(newname, conn, inbuf, outbuf); rc = unix_convert(name,conn,0,&bad_path1,&sbuf1); unix_convert(newname,conn,0,&bad_path2,&sbuf2); diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 81c102a4eef..8208bf54bbd 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -1562,7 +1562,7 @@ close_if_end = %d requires_resume_key = %d level = 0x%x, max_data_bytes = %d\n", return ERROR_NT(ntstatus); } - RESOLVE_DFSPATH(directory, conn, inbuf, outbuf); + RESOLVE_DFSPATH_WCARD(directory, conn, inbuf, outbuf); unix_convert(directory,conn,0,&bad_path,&sbuf); if (bad_path) {