shadow_copy2: Fix stream open for streams_depot paths
authorVolker Lendecke <vl@samba.org>
Fri, 14 Apr 2023 15:22:18 +0000 (17:22 +0200)
committerJeremy Allison <jra@samba.org>
Mon, 17 Apr 2023 18:11:07 +0000 (18:11 +0000)
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 <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Mon Apr 17 18:11:07 UTC 2023 on atb-devel-224

selftest/knownfail.d/shadow_depot [deleted file]
source3/modules/vfs_shadow_copy2.c

diff --git a/selftest/knownfail.d/shadow_depot b/selftest/knownfail.d/shadow_depot
deleted file mode 100644 (file)
index 0dbf553..0000000
+++ /dev/null
@@ -1 +0,0 @@
-^samba.tests.libsmb-basic.samba.tests.libsmb-basic.LibsmbTestCase.test_libsmb_shadow_depot\(fileserver_smb1\)
index 16e39c2f0701e279448fac2267a1dfc6f60f784e..a2c9d3ce4c98df834aecb110d6b75f7e5238e71d 100644 (file)
@@ -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);