The branch, master has been updated
       via  6f073f258f1 s3:rpc_server: Fix double blackslash issue in dfs path
       via  8c10f539286 s3:rpc_server: Initialize consumedcnt to 0 in 
_dfs_GetInfo()
       via  2af9c65f2a1 s3:tests: Add rpcclient 'dfsgetinfo' test
      from  083fe1c28c6 smbd: call exit_server_cleanly() to avoid panicking

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6f073f258f1f4f03a8eb568ea05be78fdbec49eb
Author: Pavel Filipenský <pfilipen...@samba.org>
Date:   Tue Jun 20 16:24:55 2023 +0200

    s3:rpc_server: Fix double blackslash issue in dfs path
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15400
    
    Signed-off-by: Pavel Filipenský <pfilipen...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>
    
    Autobuild-User(master): Jeremy Allison <j...@samba.org>
    Autobuild-Date(master): Wed Jul  5 20:24:35 UTC 2023 on atb-devel-224

commit 8c10f53928653d02bbb75d6ab05510e87ee97420
Author: Pavel Filipenský <pfilipen...@samba.org>
Date:   Fri Jun 23 10:08:39 2023 +0200

    s3:rpc_server: Initialize consumedcnt to 0 in _dfs_GetInfo()
    
    Signed-off-by: Pavel Filipenský <pfilipen...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 2af9c65f2a17ace4e1021b5c8fd6df636c904cfe
Author: Pavel Filipenský <pfilipen...@samba.org>
Date:   Fri Jun 23 12:03:30 2023 +0200

    s3:tests: Add rpcclient 'dfsgetinfo' test
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15400
    
    Signed-off-by: Pavel Filipenský <pfilipen...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/rpc_server/dfs/srv_dfs_nt.c        | 32 ++++++++++++++++++++++--------
 source3/script/tests/test_rpcclient_dfs.sh |  7 +++++++
 2 files changed, 31 insertions(+), 8 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/rpc_server/dfs/srv_dfs_nt.c 
b/source3/rpc_server/dfs/srv_dfs_nt.c
index 7b5119bbaf7..8eaa59a8b0e 100644
--- a/source3/rpc_server/dfs/srv_dfs_nt.c
+++ b/source3/rpc_server/dfs/srv_dfs_nt.c
@@ -63,6 +63,7 @@ WERROR _dfs_Add(struct pipes_struct *p, struct dfs_Add *r)
        char *altpath = NULL;
        NTSTATUS status;
        TALLOC_CTX *ctx = talloc_tos();
+       const char *pathnamep = r->in.path;
 
        if (session_info->unix_token->uid != sec_initial_uid()) {
                DEBUG(10,("_dfs_add: uid != 0. Access denied.\n"));
@@ -84,10 +85,15 @@ WERROR _dfs_Add(struct pipes_struct *p, struct dfs_Add *r)
                return WERR_NOT_ENOUGH_MEMORY;
        }
 
+       while (IS_DIRECTORY_SEP(pathnamep[0]) &&
+              IS_DIRECTORY_SEP(pathnamep[1])) {
+               pathnamep++;
+       }
+
        /* The following call can change the cwd. */
        status = get_referred_path(ctx,
                                   session_info,
-                                  r->in.path,
+                                  pathnamep,
                                   remote_address,
                                   local_address,
                                   jn, &consumedcnt, &self_ref);
@@ -141,6 +147,7 @@ WERROR _dfs_Remove(struct pipes_struct *p, struct 
dfs_Remove *r)
        TALLOC_CTX *ctx = talloc_tos();
        char *altpath = NULL;
        NTSTATUS status;
+       const char *pathnamep = r->in.dfs_entry_path;
 
        if (session_info->unix_token->uid != sec_initial_uid()) {
                DEBUG(10,("_dfs_remove: uid != 0. Access denied.\n"));
@@ -166,9 +173,14 @@ WERROR _dfs_Remove(struct pipes_struct *p, struct 
dfs_Remove *r)
                        r->in.dfs_entry_path, r->in.servername, 
r->in.sharename));
        }
 
+       while (IS_DIRECTORY_SEP(pathnamep[0]) &&
+              IS_DIRECTORY_SEP(pathnamep[1])) {
+               pathnamep++;
+       }
+
        status = get_referred_path(ctx,
                                   session_info,
-                                  r->in.dfs_entry_path,
+                                  pathnamep,
                                   remote_address,
                                   local_address,
                                   jn, &consumedcnt, &self_ref);
@@ -390,20 +402,25 @@ WERROR _dfs_GetInfo(struct pipes_struct *p, struct 
dfs_GetInfo *r)
                dcesrv_connection_get_remote_address(dcesrv_conn);
        struct auth_session_info *session_info =
                dcesrv_call_session_info(dce_call);
-       size_t consumedcnt = strlen(r->in.dfs_entry_path);
+       size_t consumedcnt = 0;
        struct junction_map *jn = NULL;
        bool self_ref = False;
        TALLOC_CTX *ctx = talloc_tos();
        bool ret;
        NTSTATUS status;
+       const char *pathnamep = r->in.dfs_entry_path;
 
        jn = talloc_zero(ctx, struct junction_map);
        if (!jn) {
                return WERR_NOT_ENOUGH_MEMORY;
        }
 
-       ret = create_junction(ctx, r->in.dfs_entry_path,
-                             jn);
+       while (IS_DIRECTORY_SEP(pathnamep[0]) &&
+              IS_DIRECTORY_SEP(pathnamep[1])) {
+               pathnamep++;
+       }
+
+       ret = create_junction(ctx, pathnamep, jn);
        if (!ret) {
                return WERR_NERR_DFSNOSUCHSERVER;
        }
@@ -411,12 +428,11 @@ WERROR _dfs_GetInfo(struct pipes_struct *p, struct 
dfs_GetInfo *r)
        /* The following call can change the cwd. */
        status = get_referred_path(ctx,
                                   session_info,
-                                  r->in.dfs_entry_path,
+                                  pathnamep,
                                   remote_address,
                                   local_address,
                                   jn, &consumedcnt, &self_ref);
-       if(!NT_STATUS_IS_OK(status) ||
-                       consumedcnt < strlen(r->in.dfs_entry_path)) {
+       if(!NT_STATUS_IS_OK(status) || consumedcnt < strlen(pathnamep)) {
                return WERR_NERR_DFSNOSUCHVOLUME;
        }
 
diff --git a/source3/script/tests/test_rpcclient_dfs.sh 
b/source3/script/tests/test_rpcclient_dfs.sh
index 6d588d2ced2..0ae9e5015cd 100755
--- a/source3/script/tests/test_rpcclient_dfs.sh
+++ b/source3/script/tests/test_rpcclient_dfs.sh
@@ -31,8 +31,15 @@ ${RPCCLIENTCMD} -c "dfsenum 5"
 RC=$?
 testit "dfsenum" test ${RC} -eq 0 || failed=$((failed + 1))
 
+# This test fails: _dfs_EnumEx() is not implemented on samba RPC server side
 ${RPCCLIENTCMD} -c "dfsenumex 5"
 RC=$?
 testit "dfsenumex" test ${RC} -eq 0 || failed=$((failed + 1))
 
+# Every backslash is reduced twice, so we need to enter it 4 times.
+# Rpc server then gets: '\\server\share\path'
+${RPCCLIENTCMD} -c "dfsgetinfo \\\\\\\\${SERVER}\\\\msdfs-share\\\\msdfs-src1 
${SERVER} msdfs-src1"
+RC=$?
+testit "dfsgetinfo" test ${RC} -eq 0 || failed=$((failed + 1))
+
 testok "$0" "${failed}"


-- 
Samba Shared Repository

Reply via email to