smbd: Fix BZ15481
authorVolker Lendecke <vl@samba.org>
Wed, 20 Sep 2023 00:44:56 +0000 (17:44 -0700)
committerJule Anger <janger@samba.org>
Fri, 22 Sep 2023 21:07:52 +0000 (21:07 +0000)
Bug: https://bugzilla.samba.org/show_bug.cgi?id=15481

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): Wed Sep 20 22:42:48 UTC 2023 on atb-devel-224

(cherry picked from commit 3481bbfede5127e3664bcf464a0ae3dec9247ab7)

Autobuild-User(v4-18-test): Jule Anger <janger@samba.org>
Autobuild-Date(v4-18-test): Fri Sep 22 21:07:52 UTC 2023 on atb-devel-224

selftest/knownfail.d/bug-15481 [deleted file]
source3/smbd/filename.c

diff --git a/selftest/knownfail.d/bug-15481 b/selftest/knownfail.d/bug-15481
deleted file mode 100644 (file)
index e4ca91c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-^samba.tests.libsmb-basic.samba.tests.libsmb-basic.LibsmbTestCase.test_gencache_pollution_bz15481
index 98506775bce125aa90559a4c5ef65edeef516c87..77f5e3dee4e96ff8554e8afa5d5ea4e38784e006 100644 (file)
@@ -785,6 +785,7 @@ static NTSTATUS openat_pathref_fsp_case_insensitive(
 
        if (lp_stat_cache()) {
                char *base_name = smb_fname_rel->base_name;
+               char *original_relname = NULL;
                DATA_BLOB value = { .data = NULL };
 
                ok = get_real_filename_cache_key(
@@ -806,7 +807,13 @@ static NTSTATUS openat_pathref_fsp_case_insensitive(
                }
                DO_PROFILE_INC(statcache_hits);
 
-               TALLOC_FREE(smb_fname_rel->base_name);
+               /*
+                * For the "new filename" case we need to preserve the
+                * capitalization the client sent us, see
+                * https://bugzilla.samba.org/show_bug.cgi?id=15481
+                */
+               original_relname = smb_fname_rel->base_name;
+
                smb_fname_rel->base_name = talloc_memdup(
                        smb_fname_rel, value.data, value.length);
                if (smb_fname_rel->base_name == NULL) {
@@ -824,10 +831,13 @@ static NTSTATUS openat_pathref_fsp_case_insensitive(
                status = openat_pathref_fsp(dirfsp, smb_fname_rel);
                if (NT_STATUS_IS_OK(status)) {
                        TALLOC_FREE(cache_key.data);
+                       TALLOC_FREE(original_relname);
                        return NT_STATUS_OK;
                }
 
                memcache_delete(NULL, GETREALFILENAME_CACHE, cache_key);
+               TALLOC_FREE(smb_fname_rel->base_name);
+               smb_fname_rel->base_name = original_relname;
        }
 
 lookup: