r6053: Fixup dfs path with the new wildcard parser code split out.
authorJeremy Allison <jra@samba.org>
Fri, 25 Mar 2005 00:58:15 +0000 (00:58 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:56:19 +0000 (10:56 -0500)
Jeremy.

source/include/msdfs.h
source/smbd/msdfs.c
source/smbd/posix_acls.c
source/smbd/reply.c
source/smbd/trans2.c

index 8b365d02ea6d27d8594859a9c0366d34309c18eb..a856f5d1abc90c5b1ca05aa35d9b99c52088936e 100644 (file)
@@ -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",                         \
index 36baff80224830f4335d60f36a28de0bf6cdc404..2e4649efed4fe7efd736e3698ff7dbb40deb1e6f 100644 (file)
@@ -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;
index c0ccdcb6d6341fc54d17d256407c59515f7ab023..76b67169f21900db60a72d83adc424ec78bd48c0 100644 (file)
@@ -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) {
index 059af830017f70832fa43901d92e4994cf1a7c28..17423c531dc2cbcff65c84430120bf288473b0dc 100644 (file)
@@ -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);
index 81c102a4eeff38b2b9e13459770965ddcd23e547..8208bf54bbdaa4df900c634957dfe2df88ddd0ec 100644 (file)
@@ -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) {