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