The branch, master has been updated via 81fdcf95ae9 s3/client: fix dfs deltree, resolve dfs path via 23a5a05db03 Add test smbclient 'delree' of dir (on DFS share) via 7c4cb498233 s3/client: fix dfs delete, resolve dfs path via db1b4df0ab3 Add test smbclient 'del' of file (on DFS share) via 39672a9676b Add new dfs node msdfs-share pointing to new msdfs-share2 from eaf829ad0bf s4/torture/unix_info2: return NULL on failure
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 81fdcf95ae92a02f83501753dec0f29ddd555eeb Author: Noel Power <noel.po...@suse.com> Date: Thu Jun 16 17:17:45 2022 +0100 s3/client: fix dfs deltree, resolve dfs path since 4cc4938a2866738aaff4dc91550bb7a5ad05d7fb do_list seems to deal with non dfs root path, hence we need to resolve the path before calling cli_unlink. Also remove the knownfail We additionally have to also remove the fallback to remove 'file3' int the smbcacls_dfs_propagate_inherit.teardown as the deltree that happens in the baseclass now succeeds. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15100 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Fri Jun 17 17:12:07 UTC 2022 on sn-devel-184 commit 23a5a05db03a8f14ab701005a8bec9a3eeff3d77 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 17 10:58:48 2022 +0100 Add test smbclient 'delree' of dir (on DFS share) deltree of a file on a DFS share results in NT_STATUS_OBJECT_PATH_NOT_FOUND Addionally add a knownfail for this (to be removed in subsequent patch to fix bug) We also need to add a knownfail (which will not be removed) for the new test which will fail in smb1 envs BUG: https://bugzilla.samba.org/show_bug.cgi?id=15100 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7c4cb4982330cd2eda53950e977179920b1e3b04 Author: Noel Power <noel.po...@suse.com> Date: Thu Jun 16 15:12:05 2022 +0100 s3/client: fix dfs delete, resolve dfs path since 4cc4938a2866738aaff4dc91550bb7a5ad05d7fb do_list seems to deal with non dfs root path, hence we need to resolve the path before calling cli_unlink. Also remove the knownfail BUG: https://bugzilla.samba.org/show_bug.cgi?id=15100 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Jeremy Allison <j...@samba.org> commit db1b4df0ab3b18821da3c2dbe6d6058f0c3019b8 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 17 10:25:49 2022 +0100 Add test smbclient 'del' of file (on DFS share) del of a file on a DFS share results in NT_STATUS_OBJECT_PATH_NOT_FOUND Addionally add a knownfail (will be removed in following patch to fix the bug) We also need to add a knownfail (which will not be removed) for the new test which will fail in smb1 envs BUG: https://bugzilla.samba.org/show_bug.cgi?id=15100 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Jeremy Allison <j...@samba.org> commit 39672a9676bff53d3ccc0ad7c1fa65a95cbceaab Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 17 10:15:42 2022 +0100 Add new dfs node msdfs-share pointing to new msdfs-share2 Also add another node within msdfs-share2 pointing to normal share This patch is in preperation for creating a test for 'del' & 'deltree' on DFS shares. The extra redirection is necessary to reproduce the bug BUG: https://bugzilla.samba.org/show_bug.cgi?id=15100 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: .../blackbox/smbcacls_dfs_propagate_inherit.py | 8 -- selftest/knownfail.d/smb1-tests | 2 + selftest/target/Samba3.pm | 9 ++ source3/client/client.c | 63 +++++++++++--- source3/script/tests/test_smbclient_s3.sh | 96 ++++++++++++++++++++++ 5 files changed, 159 insertions(+), 19 deletions(-) Changeset truncated at 500 lines: diff --git a/python/samba/tests/blackbox/smbcacls_dfs_propagate_inherit.py b/python/samba/tests/blackbox/smbcacls_dfs_propagate_inherit.py index 36c29c8ccca..42680df0d06 100644 --- a/python/samba/tests/blackbox/smbcacls_dfs_propagate_inherit.py +++ b/python/samba/tests/blackbox/smbcacls_dfs_propagate_inherit.py @@ -85,11 +85,3 @@ class DfsInheritanceSmbCaclsTests(InheritanceSmbCaclsTests): def tearDown(self): super(DfsInheritanceSmbCaclsTests, self).tearDown() - # for dfs tests inevitably we fallback to remove the local files in - # the base class, the base class however doesn't know about the - # target dfs share (or its contents) so we have to assume we need to - # remove the file on the dfs share - smbclient_args = self.build_test_cmd("smbclient", ["//%s/%s" % (self.server, self.dfs_target_share), "-c", "rm file-3"]) - self.check_output(smbclient_args) - - diff --git a/selftest/knownfail.d/smb1-tests b/selftest/knownfail.d/smb1-tests index 03d299ad7c7..b5263f28016 100644 --- a/selftest/knownfail.d/smb1-tests +++ b/selftest/knownfail.d/smb1-tests @@ -10,6 +10,8 @@ ^samba3.blackbox.smbclient_s3.NT1.(plain|sign).member_creds.interactive smbclient -l prompts on stdout\((ad_member|nt4_member)\) ^samba3.blackbox.smbclient_s3.NT1.(plain|sign).member_creds.creating a bad symlink and deleting it\((ad_member|nt4_member)\) ^samba3.blackbox.smbclient_s3.NT1.(plain|sign).member_creds.Accessing an MS-DFS link\((ad_member|nt4_member)\) +^samba3.blackbox.smbclient_s3.NT1.(plain|sign).member_creds.del on MS-DFS share\((ad_member|nt4_member)\) +^samba3.blackbox.smbclient_s3.NT1.(plain|sign).member_creds.deltree on MS-DFS share\((ad_member|nt4_member)\) ^samba3.blackbox.smbclient_s3.NT1.(plain|sign).member_creds.Ensure archive bit is set correctly on file/dir rename\((ad_member|nt4_member)\) ^samba3.blackbox.smbclient_s3.NT1.(plain|sign).member_creds.ccache access works for smbclient\((ad_member|nt4_member)\) ^samba3.blackbox.smbclient_s3.NT1.(plain|sign).member_creds.using an authentication file\((ad_member|nt4_member)\) diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm index c080c23f2ba..798796bc21f 100755 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -2519,6 +2519,9 @@ sub provision($$) my $msdfs_shrdir="$shrdir/msdfsshare"; push(@dirs,$msdfs_shrdir); + my $msdfs_shrdir2="$shrdir/msdfsshare2"; + push(@dirs,$msdfs_shrdir2); + my $msdfs_deeppath="$msdfs_shrdir/deeppath"; push(@dirs,$msdfs_deeppath); @@ -2612,6 +2615,8 @@ sub provision($$) symlink "msdfs:$server_ip\\smbcacls_sharedir_dfs,$server_ipv6\\smbcacls_sharedir_dfs", "$msdfs_shrdir/smbcacls_sharedir_dfs"; + symlink "msdfs:$server_ip\\msdfs-share2,$server_ipv6\\msdfs-share2", "$msdfs_shrdir/dfshop1"; + symlink "msdfs:$server_ip\\tmp,$server_ipv6\\tmp", "$msdfs_shrdir2/dfshop2"; ## ## create bad names in $badnames_shrdir ## @@ -2935,6 +2940,10 @@ sub provision($$) msdfs root = yes msdfs shuffle referrals = yes guest ok = yes +[msdfs-share2] + path = $msdfs_shrdir2 + msdfs root = yes + guest ok = yes [hideunread] copy = tmp hide unreadable = yes diff --git a/source3/client/client.c b/source3/client/client.c index 9f9954b7e96..651da5fbf7a 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -2354,6 +2354,9 @@ static NTSTATUS do_del(struct cli_state *cli_state, struct file_info *finfo, { TALLOC_CTX *ctx = talloc_tos(); char *mask = NULL; + struct cli_state *targetcli = NULL; + char *targetname = NULL; + struct cli_credentials *creds = samba_cmdline_get_creds(); NTSTATUS status; mask = talloc_asprintf(ctx, @@ -2370,7 +2373,15 @@ static NTSTATUS do_del(struct cli_state *cli_state, struct file_info *finfo, return NT_STATUS_OK; } - status = cli_unlink(cli_state, mask, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN); + status = cli_resolve_path(ctx, "", + creds, + cli, mask, &targetcli, &targetname); + if (!NT_STATUS_IS_OK(status)) { + goto out; + } + + status = cli_unlink(targetcli, targetname, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN); +out: if (!NT_STATUS_IS_OK(status)) { d_printf("%s deleting remote file %s\n", nt_errstr(status), mask); @@ -2428,20 +2439,37 @@ static NTSTATUS delete_remote_files_list(struct cli_state *cli_state, { NTSTATUS status = NT_STATUS_OK; struct file_list *deltree_list_iter = NULL; + char *targetname = NULL; + struct cli_state *targetcli = NULL; + struct cli_credentials *creds = samba_cmdline_get_creds(); + TALLOC_CTX *ctx = talloc_tos(); for (deltree_list_iter = flist; deltree_list_iter != NULL; deltree_list_iter = deltree_list_iter->next) { + status = cli_resolve_path(ctx, + "", + creds, + cli_state, + deltree_list_iter->file_path, + &targetcli, + &targetname); + if (!NT_STATUS_IS_OK(status)) { + d_printf("delete_remote_files %s: %s\n", + deltree_list_iter->file_path, + nt_errstr(status)); + return status; + } if (CLI_DIRSEP_CHAR == '/') { /* POSIX. */ - status = cli_posix_unlink(cli_state, - deltree_list_iter->file_path); + status = cli_posix_unlink(targetcli, + targetname); } else if (deltree_list_iter->isdir) { - status = cli_rmdir(cli_state, - deltree_list_iter->file_path); + status = cli_rmdir(targetcli, + targetname); } else { - status = cli_unlink(cli_state, - deltree_list_iter->file_path, + status = cli_unlink(targetcli, + targetname, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN); } @@ -2550,14 +2578,27 @@ static int cmd_deltree(void) deltree_list_iter = deltree_list_iter->next) { if (deltree_list_iter->isdir == false) { + char *targetname = NULL; + struct cli_state *targetcli = NULL; + struct cli_credentials *creds = samba_cmdline_get_creds(); + status = cli_resolve_path(ctx, + "", + creds, + cli, + deltree_list_iter->file_path, + &targetcli, + &targetname); + if (!NT_STATUS_IS_OK(status)) { + goto err; + } /* Just a regular file. */ if (CLI_DIRSEP_CHAR == '/') { /* POSIX. */ - status = cli_posix_unlink(cli, - deltree_list_iter->file_path); + status = cli_posix_unlink(targetcli, + targetname); } else { - status = cli_unlink(cli, - deltree_list_iter->file_path, + status = cli_unlink(targetcli, + targetname, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN); } diff --git a/source3/script/tests/test_smbclient_s3.sh b/source3/script/tests/test_smbclient_s3.sh index da4fa62a144..bc03f432411 100755 --- a/source3/script/tests/test_smbclient_s3.sh +++ b/source3/script/tests/test_smbclient_s3.sh @@ -527,6 +527,94 @@ EOF return 0 } +test_msdfs_del() +{ + tmpfile="$PREFIX/smbclient.in.$$" + filename_src="src.$$" + filename_src_path="$PREFIX/$filename_src" + rm -f "$filename_src_path" + touch "$filename_src_path" + + cat > $tmpfile <<EOF +lcd $PREFIX +cd dfshop1 +cd dfshop2 +put $filename_src +del $filename_src +quit +EOF + + cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1' + eval echo "$cmd" + out=`eval $cmd` + ret=$? + rm -f "$tmpfile" + rm -f "$filename_src_path" + + if [ $ret != 0 ] ; then + echo "$out" + echo "failed deleteing $filename_src with error $ret" + return 1 + fi + + echo "$out" | grep "NT_STATUS" >/dev/null 2>&1 + + ret="$?" + if [ "$ret" -eq 0 ] ; then + echo "$out" + echo "del $filename_src NT_STATUS_ error" + return 1 + fi + return 0 +} + +test_msdfs_deltree() +{ + tmpfile="$PREFIX/smbclient.in.$$" + dirname_src="foodir.$$" + filename_src="src.$$" + filename_src_path="$PREFIX/$filename_src" + dirname_src_path="$PREFIX/$dirname" + rm -f "$filename_src_path" + touch "$filename_src_path" + + cat > $tmpfile <<EOF +lcd $PREFIX +cd dfshop1 +cd dfshop2 +mkdir $dirname_src +cd $dirname_src +put $filename_src +cd .. +deltree $dirname_src +quit +EOF + + cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1' + eval echo "$cmd" + out=`eval $cmd` + ret=$? + rm -f "$tmpfile" + rm -f "$filename_src_path" + rm -f "$dirname_src_path" + + if [ $ret != 0 ] ; then + echo "$out" + echo "deltree failed deleting dir $dirname_src with error $ret" + return 1 + fi + + echo "$out" | grep "NT_STATUS" >/dev/null 2>&1 + + ret="$?" + if [ "$ret" -eq 0 ] ; then + echo "$out" + echo "deltree $dirname_src NT_STATUS_ error" + return 1 + fi + return 0 +} + # Archive bits are correctly set on file/dir creation and rename. test_rename_archive_bit() { @@ -2167,6 +2255,14 @@ testit "Hardlink on MS-DFS share" \ test_msdfs_hardlink || failed=$(expr $failed + 1) +testit "del on MS-DFS share" \ + test_msdfs_del || \ + failed=`expr $failed + 1` + +testit "deltree on MS-DFS share" \ + test_msdfs_deltree || \ + failed=`expr $failed + 1` + testit "Ensure archive bit is set correctly on file/dir rename" \ test_rename_archive_bit || failed=$(expr $failed + 1) -- Samba Shared Repository