mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
r6053: Fixup dfs path with the new wildcard parser code split out.
Jeremy.
(This used to be commit e831cef618
)
This commit is contained in:
parent
66e8ed2632
commit
a5433c4bf7
@ -72,6 +72,13 @@ struct dfs_path
|
|||||||
return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, \
|
return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, \
|
||||||
ERRSRV, ERRbadpath);; }
|
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) \
|
#define init_dfsroot(conn, inbuf, outbuf) \
|
||||||
{ if (lp_msdfs_root(SNUM(conn)) && lp_host_msdfs()) { \
|
{ if (lp_msdfs_root(SNUM(conn)) && lp_host_msdfs()) { \
|
||||||
DEBUG(2,("Serving %s as a Dfs root\n", \
|
DEBUG(2,("Serving %s as a Dfs root\n", \
|
||||||
|
@ -75,7 +75,7 @@ static BOOL parse_dfs_path(char* pathname, struct dfs_path* pdp)
|
|||||||
into the dfs_path structure
|
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;
|
pstring pathname_local;
|
||||||
char* p,*temp;
|
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));
|
DEBUG(10,("parse_processed_dfs_path: servicename: %s\n",pdp->servicename));
|
||||||
|
|
||||||
/* rest is reqpath */
|
/* 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));
|
DEBUG(10,("parse_processed_dfs_path: rest of the path: %s\n",pdp->reqpath));
|
||||||
return True;
|
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,
|
Used by other functions to decide if a dfs path is remote,
|
||||||
and to get the list of referred locations for that remote path.
|
and to get the list of referred locations for that remote path.
|
||||||
|
|
||||||
findfirst_flag: For findfirsts, dfs links themselves are not
|
allow_wcards: Should we allow wildcards when parsing paths.
|
||||||
redirected, but paths beyond the links are. For normal smb calls,
|
|
||||||
even dfs links need to be redirected.
|
|
||||||
|
|
||||||
self_referralp: clients expect a dfs referral for the same share when
|
self_referralp: clients expect a dfs referral for the same share when
|
||||||
they request referrals for dfs roots on a server.
|
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,
|
static BOOL resolve_dfs_path(pstring dfspath, struct dfs_path* dp,
|
||||||
connection_struct* conn,
|
connection_struct* conn,
|
||||||
BOOL findfirst_flag,
|
BOOL allow_wcards,
|
||||||
struct referral** reflistpp, int* refcntp,
|
struct referral** reflistpp, int* refcntp,
|
||||||
BOOL* self_referralp, int* consumedcntp)
|
BOOL* self_referralp, int* consumedcntp)
|
||||||
{
|
{
|
||||||
@ -311,17 +313,10 @@ static BOOL resolve_dfs_path(pstring dfspath, struct dfs_path* dp,
|
|||||||
|
|
||||||
/* check if need to redirect */
|
/* check if need to redirect */
|
||||||
if (is_msdfs_link(conn, localpath, reflistpp, refcntp, NULL)) {
|
if (is_msdfs_link(conn, localpath, reflistpp, refcntp, NULL)) {
|
||||||
if (findfirst_flag) {
|
DEBUG(6,("resolve_dfs_path: %s resolves to a valid Dfs link.\n", dfspath));
|
||||||
DEBUG(6,("resolve_dfs_path (FindFirst) No redirection "
|
if (consumedcntp)
|
||||||
"for dfs link %s.\n", dfspath));
|
*consumedcntp = strlen(dfspath);
|
||||||
return False;
|
return True;
|
||||||
} else {
|
|
||||||
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 */
|
/* redirect if any component in the path is a link */
|
||||||
@ -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
|
If not, the pathname is converted to a tcon-relative local unix path
|
||||||
*****************************************************************/
|
*****************************************************************/
|
||||||
|
|
||||||
BOOL dfs_redirect(pstring pathname, connection_struct* conn,
|
BOOL dfs_redirect(pstring pathname, connection_struct* conn, BOOL allow_wcards)
|
||||||
BOOL findfirst_flag)
|
|
||||||
{
|
{
|
||||||
struct dfs_path dp;
|
struct dfs_path dp;
|
||||||
|
|
||||||
if (!conn || !pathname)
|
if (!conn || !pathname)
|
||||||
return False;
|
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
|
/* if dfs pathname for a non-dfs share, convert to tcon-relative
|
||||||
path and return false */
|
path and return false */
|
||||||
@ -386,7 +380,7 @@ BOOL dfs_redirect(pstring pathname, connection_struct* conn,
|
|||||||
if (!strequal(dp.servicename, lp_servicename(SNUM(conn)) ))
|
if (!strequal(dp.servicename, lp_servicename(SNUM(conn)) ))
|
||||||
return False;
|
return False;
|
||||||
|
|
||||||
if (resolve_dfs_path(pathname, &dp, conn, findfirst_flag,
|
if (resolve_dfs_path(pathname, &dp, conn, allow_wcards,
|
||||||
NULL, NULL, NULL, NULL)) {
|
NULL, NULL, NULL, NULL)) {
|
||||||
DEBUG(3,("dfs_redirect: Redirecting %s\n", pathname));
|
DEBUG(3,("dfs_redirect: Redirecting %s\n", pathname));
|
||||||
return True;
|
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
|
Creates a junction structure from a Dfs pathname
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
BOOL create_junction(char* pathname, struct junction_map* jucn)
|
BOOL create_junction(char* pathname, struct junction_map* jucn)
|
||||||
{
|
{
|
||||||
struct dfs_path dp;
|
struct dfs_path dp;
|
||||||
|
@ -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);
|
create_file_sids(&sbuf, &file_owner_sid, &file_grp_sid);
|
||||||
|
|
||||||
acl_perms = unpack_canon_ace( fsp, &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. */
|
/* Ignore W2K traverse DACL set. */
|
||||||
if (file_ace_list || dir_ace_list) {
|
if (file_ace_list || dir_ace_list) {
|
||||||
|
@ -949,7 +949,7 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
return ERROR_NT(nt_status);
|
return ERROR_NT(nt_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(path, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH_WCARD(path, conn, inbuf, outbuf);
|
||||||
|
|
||||||
p++;
|
p++;
|
||||||
status_len = SVAL(p, 0);
|
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);
|
return ERROR_NT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf);
|
||||||
|
|
||||||
DEBUG(3,("reply_unlink : %s\n",name));
|
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);
|
return ERROR_NT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf);
|
||||||
RESOLVE_DFSPATH(newname, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH_WCARD(newname, conn, inbuf, outbuf);
|
||||||
|
|
||||||
DEBUG(3,("reply_mv : %s -> %s\n",name,newname));
|
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);
|
return ERROR_DOS(ERRSRV,ERRinvdevice);
|
||||||
}
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf);
|
||||||
RESOLVE_DFSPATH(newname, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH_WCARD(newname, conn, inbuf, outbuf);
|
||||||
|
|
||||||
rc = unix_convert(name,conn,0,&bad_path1,&sbuf1);
|
rc = unix_convert(name,conn,0,&bad_path1,&sbuf1);
|
||||||
unix_convert(newname,conn,0,&bad_path2,&sbuf2);
|
unix_convert(newname,conn,0,&bad_path2,&sbuf2);
|
||||||
|
@ -1562,7 +1562,7 @@ close_if_end = %d requires_resume_key = %d level = 0x%x, max_data_bytes = %d\n",
|
|||||||
return ERROR_NT(ntstatus);
|
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);
|
unix_convert(directory,conn,0,&bad_path,&sbuf);
|
||||||
if (bad_path) {
|
if (bad_path) {
|
||||||
|
Loading…
Reference in New Issue
Block a user