From: Joel Rosdahl Date: Tue, 7 Jun 2022 14:53:44 +0000 (+0200) Subject: fix: Use correct umask when populating primary cache from secondary X-Git-Tag: v4.6.2~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8294d99c547d952d9d0fa1fff607eb7dfd9f9f7d;p=thirdparty%2Fccache.git fix: Use correct umask when populating primary cache from secondary Util::get_umask retrieves the process's umask and caches it to avoid some system calls. This doesn't interact well now when using UmaskScope to change umask temporarily since Util::get_umask then only sometimes returns the correct value. This leads to the incorrect umask being used when writing cache entries to the primary storage for secondary storage hits. Fix this by not caching the umask system call. Closes #1087. (cherry picked from commit 6484cdfa0f22214d91cd61562f48d4d9060d2533) --- diff --git a/src/Util.cpp b/src/Util.cpp index abbf76d3e..8898337f1 100644 --- a/src/Util.cpp +++ b/src/Util.cpp @@ -747,20 +747,13 @@ get_relative_path(string_view dir, string_view path) return result.empty() ? "." : result; } -#ifndef _WIN32 mode_t get_umask() { - static bool mask_retrieved = false; - static mode_t mask; - if (!mask_retrieved) { - mask = umask(0); - umask(mask); - mask_retrieved = true; - } + const mode_t mask = umask(0); + umask(mask); return mask; } -#endif void hard_link(const std::string& oldpath, const std::string& newpath) diff --git a/src/Util.hpp b/src/Util.hpp index 4ddffa346..d0c58b869 100644 --- a/src/Util.hpp +++ b/src/Util.hpp @@ -188,10 +188,8 @@ const char* get_hostname(); std::string get_relative_path(nonstd::string_view dir, nonstd::string_view path); -#ifndef _WIN32 // Get process umask. mode_t get_umask(); -#endif // Hard-link `oldpath` to `newpath`. Throws `core::Error` on error. void hard_link(const std::string& oldpath, const std::string& newpath); diff --git a/test/suites/secondary_file.bash b/test/suites/secondary_file.bash index 3c539874f..1a6886259 100644 --- a/test/suites/secondary_file.bash +++ b/test/suites/secondary_file.bash @@ -167,18 +167,22 @@ SUITE_secondary_file() { # ------------------------------------------------------------------------- TEST "umask" - CCACHE_SECONDARY_STORAGE="file://$PWD/secondary|umask=022" + export CCACHE_UMASK=042 + CCACHE_SECONDARY_STORAGE="file://$PWD/secondary|umask=024" rm -rf secondary $CCACHE_COMPILE -c test.c - expect_perm secondary drwxr-xr-x - expect_perm secondary/CACHEDIR.TAG -rw-r--r-- + expect_perm secondary drwxr-x-wx # 777 & 024 + expect_perm secondary/CACHEDIR.TAG -rw-r---w- # 666 & 024 + 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 - CCACHE_SECONDARY_STORAGE="file://$PWD/secondary|umask=000" + CCACHE_SECONDARY_STORAGE="file://$PWD/secondary|umask=026" $CCACHE -C >/dev/null rm -rf secondary $CCACHE_COMPILE -c test.c - expect_perm secondary drwxrwxrwx - expect_perm secondary/CACHEDIR.TAG -rw-rw-rw- + expect_perm secondary drwxr-x--x # 777 & 026 + expect_perm secondary/CACHEDIR.TAG -rw-r----- # 666 & 026 # ------------------------------------------------------------------------- TEST "Sharding"