From 250de98c89fc9b0bba51368ffbd1fc09cf2f50e6 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 14 Apr 2023 15:34:17 +0000 Subject: [PATCH 1/2] tests: Show that streams_depot and shadow_copy2 don't play together See the next patch, we assert in shadow_copy2_openat() over paths passed in from shadow_copy2 BUG: https://bugzilla.samba.org/show_bug.cgi?id=15358 Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison (cherry picked from commit 0327334c89cfda9020c6044a7b2b182138e46d03) --- python/samba/tests/libsmb-basic.py | 15 ++++++++++++++- selftest/knownfail.d/shadow_depot | 1 + selftest/target/Samba3.pm | 5 +++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 selftest/knownfail.d/shadow_depot diff --git a/python/samba/tests/libsmb-basic.py b/python/samba/tests/libsmb-basic.py index 37b82b26dac..cbe7cce5bae 100644 --- a/python/samba/tests/libsmb-basic.py +++ b/python/samba/tests/libsmb-basic.py @@ -19,7 +19,7 @@ from samba.samba3 import libsmb_samba_internal as libsmb from samba.dcerpc import security -from samba import NTSTATUSError +from samba import NTSTATUSError,ntstatus from samba.ntstatus import NT_STATUS_DELETE_PENDING from samba.credentials import SMB_ENCRYPTION_REQUIRED import samba.tests.libsmb @@ -202,6 +202,19 @@ class LibsmbTestCase(samba.tests.libsmb.LibsmbTests): c.rmdir("subdir") self.assertTrue(ret) + def test_libsmb_shadow_depot(self): + c = libsmb.Conn(self.server_ip, "shadow_depot", self.lp, self.creds) + try: + fnum=c.create("x:y",CreateDisposition=libsmb.FILE_CREATE) + c.close(fnum) + except: + self.fail() + finally: + # "c" might have crashed, get a new connection + c1 = libsmb.Conn(self.server_ip, "shadow_depot", self.lp, self.creds) + c1.unlink("x") + c1 = None + if __name__ == "__main__": import unittest unittest.main() diff --git a/selftest/knownfail.d/shadow_depot b/selftest/knownfail.d/shadow_depot new file mode 100644 index 00000000000..0dbf553a9ef --- /dev/null +++ b/selftest/knownfail.d/shadow_depot @@ -0,0 +1 @@ +^samba.tests.libsmb-basic.samba.tests.libsmb-basic.LibsmbTestCase.test_libsmb_shadow_depot\(fileserver_smb1\) diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm index c8fe925a948..e0e3c026fa6 100755 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -3405,6 +3405,11 @@ sub provision($$) shadow:fixinodes = yes smbd async dosmode = yes +[shadow_depot] + path = $shadow_shrdir + comment = previous versions with streams_depot + vfs objects = streams_depot shadow_copy2 + [dfq] path = $shrdir/dfree vfs objects = acl_xattr fake_acls xattr_tdb fake_dfq -- 2.30.2 From bca97f3e0db808c3aa92e6367a98637817bfb041 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 14 Apr 2023 17:22:18 +0200 Subject: [PATCH 2/2] shadow_copy2: Fix stream open for streams_depot paths streams_depot hands us absolute paths with : filename components instead of having set smb_fname_in->stream_name. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15358 Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Mon Apr 17 18:11:07 UTC 2023 on atb-devel-224 (cherry picked from commit 526f381f413d1cb5cde93b9542034f5ebfcfcc10) --- selftest/knownfail.d/shadow_depot | 1 - source3/modules/vfs_shadow_copy2.c | 25 ++++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) delete mode 100644 selftest/knownfail.d/shadow_depot diff --git a/selftest/knownfail.d/shadow_depot b/selftest/knownfail.d/shadow_depot deleted file mode 100644 index 0dbf553a9ef..00000000000 --- a/selftest/knownfail.d/shadow_depot +++ /dev/null @@ -1 +0,0 @@ -^samba.tests.libsmb-basic.samba.tests.libsmb-basic.LibsmbTestCase.test_libsmb_shadow_depot\(fileserver_smb1\) diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c index 16e39c2f070..a2c9d3ce4c9 100644 --- a/source3/modules/vfs_shadow_copy2.c +++ b/source3/modules/vfs_shadow_copy2.c @@ -1522,15 +1522,22 @@ static struct smb_filename *shadow_copy2_openat_name( if (fsp->base_fsp != NULL) { struct smb_filename *base_fname = fsp->base_fsp->fsp_name; - SMB_ASSERT(is_named_stream(smb_fname_in)); - - result = synthetic_smb_fname( - mem_ctx, - base_fname->base_name, - smb_fname_in->stream_name, - &smb_fname_in->st, - smb_fname_in->twrp, - smb_fname_in->flags); + if (smb_fname_in->base_name[0] == '/') { + /* + * Special-case stream names from streams_depot + */ + result = cp_smb_filename(mem_ctx, smb_fname_in); + } else { + + SMB_ASSERT(is_named_stream(smb_fname_in)); + + result = synthetic_smb_fname(mem_ctx, + base_fname->base_name, + smb_fname_in->stream_name, + &smb_fname_in->st, + smb_fname_in->twrp, + smb_fname_in->flags); + } } else { result = full_path_from_dirfsp_atname( mem_ctx, dirfsp, smb_fname_in); -- 2.30.2