From 63a988d5deae415ca436c7327dec729c16961b12 Mon Sep 17 00:00:00 2001 From: Joel Rosdahl Date: Fri, 23 Dec 2022 19:03:13 +0100 Subject: fix: Only use original umask when retrieving result This fixes a problem where the original umask would be used when storing a remote cache result in the local cache in from_cache. Fixes #1235. --- src/ccache.cpp | 3 +-- test/suites/remote_file.bash | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/ccache.cpp b/src/ccache.cpp index 8f71e2a2..5179d8d3 100644 --- a/src/ccache.cpp +++ b/src/ccache.cpp @@ -2040,8 +2040,6 @@ enum class FromCacheCallMode { direct, cpp }; static nonstd::expected from_cache(Context& ctx, FromCacheCallMode mode, const Digest& result_key) { - UmaskScope umask_scope(ctx.original_umask); - // The user might be disabling cache hits. if (ctx.config.recache()) { return false; @@ -2080,6 +2078,7 @@ from_cache(Context& ctx, FromCacheCallMode mode, const Digest& result_key) cache_entry.verify_checksum(); core::Result::Deserializer deserializer(cache_entry.payload()); core::ResultRetriever result_retriever(ctx, result_key); + UmaskScope umask_scope(ctx.original_umask); deserializer.visit(result_retriever); } catch (core::ResultRetriever::WriteError& e) { LOG("Write error when retrieving result from {}: {}", diff --git a/test/suites/remote_file.bash b/test/suites/remote_file.bash index 39184884..e64afda5 100644 --- a/test/suites/remote_file.bash +++ b/test/suites/remote_file.bash @@ -274,7 +274,8 @@ SUITE_remote_file() { export CCACHE_UMASK=042 CCACHE_REMOTE_STORAGE="file://$PWD/remote|umask=024" - rm -rf remote + + # local -> remote, cache miss $CCACHE_COMPILE -c test.c expect_perm remote drwxr-x-wx # 777 & 024 expect_perm remote/CACHEDIR.TAG -rw-r---w- # 666 & 024 @@ -282,12 +283,25 @@ SUITE_remote_file() { expect_perm "$(dirname "${result_file}")" drwx-wxr-x # 777 & 042 expect_perm "${result_file}" -rw--w-r-- # 666 & 042 + # local -> remote, local cache hit CCACHE_REMOTE_STORAGE="file://$PWD/remote|umask=026" $CCACHE -C >/dev/null rm -rf remote $CCACHE_COMPILE -c test.c expect_perm remote drwxr-x--x # 777 & 026 expect_perm remote/CACHEDIR.TAG -rw-r----- # 666 & 026 + result_file=$(find $CCACHE_DIR -name '*R') + expect_perm "$(dirname "${result_file}")" drwx-wxr-x # 777 & 042 + expect_perm "${result_file}" -rw--w-r-- # 666 & 042 + + # remote -> local, remote cache hit + $CCACHE -C >/dev/null + $CCACHE_COMPILE -c test.c + expect_perm remote drwxr-x--x # 777 & 026 + expect_perm remote/CACHEDIR.TAG -rw-r----- # 666 & 026 + result_file=$(find $CCACHE_DIR -name '*R') + expect_perm "$(dirname "${result_file}")" drwx-wxr-x # 777 & 042 + expect_perm "${result_file}" -rw--w-r-- # 666 & 042 # ------------------------------------------------------------------------- TEST "Sharding" -- cgit v1.2.1