r21754: Volker is completely correct. There's no need for
authorJeremy Allison <jra@samba.org>
Wed, 7 Mar 2007 22:12:58 +0000 (22:12 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:18:28 +0000 (12:18 -0500)
the RESOLVE_DFSPATH macros and their varients
any more. Fix reporting profile bug with all
error returns.
Jeremy.
(This used to be commit cdf0fdb1049fd68b46885cbea887dc0e595fa524)

source3/include/msdfs.h
source3/smbd/msdfs.c
source3/smbd/nttrans.c
source3/smbd/reply.c
source3/smbd/trans2.c

index 4e3487de0f45ef0bec6c84c3d53cefa690f5a89b..bf553f4a993bec5f4c2cd93661f39d0daab5e903 100644 (file)
@@ -64,26 +64,6 @@ struct dfs_path {
        pstring reqpath;
 };
 
-#define RESOLVE_DFSPATH(name, conn, inbuf, outbuf)             \
-{ if ((SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES) &&         \
-      lp_host_msdfs() && lp_msdfs_root(SNUM(conn)) &&          \
-      dfs_redirect(name, conn, False))                         \
-             return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED,     \
-                              ERRSRV, ERRbadpath);; }          
-
-#define RESOLVE_DFSPATH_STATUS(name, conn, inbuf, outbuf)              \
-{ if ((SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES) &&         \
-      lp_host_msdfs() && lp_msdfs_root(SNUM(conn)) &&          \
-      dfs_redirect(name, conn, False))                         \
-             return NT_STATUS_PATH_NOT_COVERED;; }             
-
-#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 c24cdcc7086a196516a81d706023b672c0c2de34..f06bb3b044d9f0976bf2d6b42226e715e8aa8200 100644 (file)
@@ -3,6 +3,7 @@
    Version 3.0
    MSDfs services for Samba
    Copyright (C) Shirish Kalele 2000
+   Copyright (C) Jeremy Allison 2007
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -435,7 +436,7 @@ static BOOL resolve_dfs_path(TALLOC_CTX *ctx,
   for details.
 *****************************************************************/
 
-BOOL dfs_redirect( pstring pathname, connection_struct *conn, BOOL search_wcard_flag )
+static BOOL dfs_redirect( connection_struct *conn, pstring pathname, BOOL search_wcard_flag )
 {
        struct dfs_path dp;
        
@@ -1149,3 +1150,32 @@ int enum_msdfs_links(TALLOC_CTX *ctx, struct junction_map *jucn, int jn_max)
        }
        return jn_count;
 }
+
+/******************************************************************************
+ Core function to resolve a dfs pathname.
+******************************************************************************/
+
+BOOL resolve_dfspath(connection_struct *conn, BOOL dfs_pathnames, pstring name)
+{
+       if (dfs_pathnames && lp_host_msdfs() && lp_msdfs_root(SNUM(conn)) &&
+                       dfs_redirect(conn, name, False)) {
+               return False; /* Pathname didn't resolve. */
+       }
+       return True;
+}
+
+/******************************************************************************
+ Core function to resolve a dfs pathname possibly containing a wildcard.
+ This function is identical to the above except for the BOOL param to
+ dfs_redirect but I need this to be separate so it's really clear when
+ we're allowing wildcards and when we're not. JRA.
+******************************************************************************/
+
+BOOL resolve_dfspath_wcard(connection_struct *conn, BOOL dfs_pathnames, pstring name)
+{
+       if (dfs_pathnames && lp_host_msdfs() && lp_msdfs_root(SNUM(conn)) &&
+                       dfs_redirect(conn, name, True)) {
+               return False; /* Pathname didn't resolve. */
+       }
+       return True;
+}
index 19989d2178209a8381ef9411e73f234b2a8193fe..0cc7193170b20f2748e7f2c3e6e5ace0f3e4bc74 100644 (file)
@@ -615,7 +615,10 @@ int reply_ntcreate_and_X(connection_struct *conn,
         * Now contruct the smb_open_mode value from the filename, 
         * desired access and the share access.
         */
-       RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+               END_PROFILE(SMBntcreateX);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        oplock_request = (flags & REQUEST_OPLOCK) ? EXCLUSIVE_OPLOCK : 0;
        if (oplock_request) {
@@ -1270,7 +1273,9 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
                
        new_file_attributes = set_posix_case_semantics(conn, file_attributes);
     
-       RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        status = unix_convert(conn, fname, False, NULL, &sbuf);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1749,9 +1754,15 @@ int reply_ntrename(connection_struct *conn,
                return ERROR_NT(status);
        }
        
-       RESOLVE_DFSPATH(oldname, conn, inbuf, outbuf);
-       RESOLVE_DFSPATH(newname, conn, inbuf, outbuf);
-       
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, oldname)) {
+               END_PROFILE(SMBntrename);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, newname)) {
+               END_PROFILE(SMBntrename);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
+
        DEBUG(3,("reply_ntrename : %s -> %s\n",oldname,newname));
        
        switch(rename_type) {
index df560390c949fd2f39ad93b5c09b8d2f19c33a7b..f85f635d6b5f302eae1a756d63914f7dea331d03 100644 (file)
@@ -632,7 +632,10 @@ int reply_checkpath(connection_struct *conn, char *inbuf,char *outbuf, int dum_s
                return ERROR_NT(status);
        }
 
-       RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, name)) {
+               END_PROFILE(SMBcheckpath);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        DEBUG(3,("reply_checkpath %s mode=%d\n", name, (int)SVAL(inbuf,smb_vwv0)));
 
@@ -711,7 +714,10 @@ int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
                return ERROR_NT(status);
        }
 
-       RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+               END_PROFILE(SMBgetatr);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
   
        /* dos smetimes asks for a stat of "" - it returns a "hidden directory"
                under WfWg - weird! */
@@ -790,7 +796,10 @@ int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
                return ERROR_NT(status);
        }
 
-       RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+               END_PROFILE(SMBsetatr);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
   
        status = unix_convert(conn, fname, False, NULL, &sbuf);
        if (!NT_STATUS_IS_OK(status)) {
@@ -945,7 +954,10 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
                return ERROR_NT(nt_status);
        }
 
-       RESOLVE_DFSPATH_WCARD(path, conn, inbuf, outbuf);
+       if (!resolve_dfspath_wcard(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, path)) {
+               END_PROFILE(SMBsearch);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
   
        p++;
        status_len = SVAL(p, 0);
@@ -1203,7 +1215,10 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                return ERROR_NT(status);
        }
 
-       RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+               END_PROFILE(SMBopen);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        status = unix_convert(conn, fname, False, NULL, &sbuf);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1327,7 +1342,10 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
                return ERROR_NT(status);
        }
 
-       RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+               END_PROFILE(SMBopenX);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        status = unix_convert(conn, fname, False, NULL, &sbuf);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1505,7 +1523,10 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                return ERROR_NT(status);
        }
 
-       RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+               END_PROFILE(SMBcreate);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        status = unix_convert(conn, fname, False, NULL, &sbuf);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1601,7 +1622,10 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                pstrcat(fname,"TMXXXXXX");
        }
 
-       RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+               END_PROFILE(SMBctemp);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        status = unix_convert(conn, fname, False, NULL, &sbuf);
        if (!NT_STATUS_IS_OK(status)) {
@@ -2004,7 +2028,10 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
                return ERROR_NT(status);
        }
        
-       RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf);
+       if (!resolve_dfspath_wcard(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, name)) {
+               END_PROFILE(SMBunlink);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
        
        DEBUG(3,("reply_unlink : %s\n",name));
        
@@ -3634,7 +3661,10 @@ int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                return ERROR_NT(status);
        }
 
-       RESOLVE_DFSPATH(directory, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, directory)) {
+               END_PROFILE(SMBmkdir);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        status = unix_convert(conn, directory, False, NULL, &sbuf);
        if (!NT_STATUS_IS_OK(status)) {
@@ -3852,7 +3882,10 @@ int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                return ERROR_NT(status);
        }
 
-       RESOLVE_DFSPATH(directory, conn, inbuf, outbuf)
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, directory)) {
+               END_PROFILE(SMBrmdir);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        status = unix_convert(conn, directory, False, NULL, &sbuf);
        if (!NT_STATUS_IS_OK(status)) {
@@ -4604,8 +4637,14 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                return ERROR_NT(status);
        }
        
-       RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf);
-       RESOLVE_DFSPATH_WCARD(newname, conn, inbuf, outbuf);
+       if (!resolve_dfspath_wcard(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, name)) {
+               END_PROFILE(SMBmv);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
+       if (!resolve_dfspath_wcard(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, newname)) {
+               END_PROFILE(SMBmv);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
        
        DEBUG(3,("reply_mv : %s -> %s\n",name,newname));
        
@@ -4791,8 +4830,14 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                return ERROR_DOS(ERRSRV,ERRinvdevice);
        }
 
-       RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf);
-       RESOLVE_DFSPATH_WCARD(newname, conn, inbuf, outbuf);
+       if (!resolve_dfspath_wcard(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, name)) {
+               END_PROFILE(SMBcopy);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
+       if (!resolve_dfspath_wcard(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, newname)) {
+               END_PROFILE(SMBcopy);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        status = unix_convert(conn, name, source_has_wild, NULL, &sbuf1);
        if (!NT_STATUS_IS_OK(status)) {
@@ -4983,7 +5028,10 @@ int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
                return ERROR_NT(status);
        }
   
-       RESOLVE_DFSPATH(newdir, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, newdir)) {
+               END_PROFILE(pathworks_setdir);
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        if (strlen(newdir) != 0) {
                if (!vfs_directory_exist(conn,newdir,NULL)) {
index 0951160b3c7c49611c7b7da6ac99edf3317fc527..00327ddf45343f8ce97e51b522307cfd837c7e89 100644 (file)
@@ -1746,7 +1746,9 @@ close_if_end = %d requires_resume_key = %d level = 0x%x, max_data_bytes = %d\n",
                return ERROR_NT(ntstatus);
        }
 
-       RESOLVE_DFSPATH_WCARD(directory, conn, inbuf, outbuf);
+       if (!resolve_dfspath_wcard(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, directory)) {
+               return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+       }
 
        ntstatus = unix_convert(conn, directory, True, NULL, &sbuf);
        if (!NT_STATUS_IS_OK(ntstatus)) {
@@ -3140,7 +3142,9 @@ static int call_trans2qfilepathinfo(connection_struct *conn, char *inbuf, char *
                        return ERROR_NT(status);
                }
 
-               RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+               if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+                       return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+               }
 
                status = unix_convert(conn, fname, False, NULL, &sbuf);
                if (!NT_STATUS_IS_OK(status)) {
@@ -4304,7 +4308,9 @@ static NTSTATUS smb_set_file_unix_hlink(connection_struct *conn,
                return status;
        }
 
-       RESOLVE_DFSPATH_STATUS(oldname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, oldname)) {
+               return NT_STATUS_PATH_NOT_COVERED;
+       }
 
        DEBUG(10,("smb_set_file_unix_hlink: SMB_SET_FILE_UNIX_LINK doing hard link %s -> %s\n",
                fname, oldname));
@@ -4350,7 +4356,9 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
                return status;
        }
 
-       RESOLVE_DFSPATH_STATUS(newname, conn, inbuf, outbuf);
+       if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, newname)) {
+               return NT_STATUS_PATH_NOT_COVERED;
+       }
 
        /* Check the new name has no '/' characters. */
        if (strchr_m(newname, '/')) {
@@ -5432,7 +5440,9 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
                        return ERROR_NT(status);
                }
 
-               RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
+               if (!resolve_dfspath(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, fname)) {
+                       ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+               }
 
                status = unix_convert(conn, fname, False, NULL, &sbuf);
                if (!NT_STATUS_IS_OK(status)) {