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.7~202 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6484cdfa0f22214d91cd61562f48d4d9060d2533;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. --- diff --git a/src/Util.cpp b/src/Util.cpp index b94ee1a81..501e2c3d2 100644 --- a/src/Util.cpp +++ b/src/Util.cpp @@ -744,20 +744,13 @@ get_relative_path(std::string_view dir, std::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 bf5548440..6e299f583 100644 --- a/src/Util.hpp +++ b/src/Util.hpp @@ -184,10 +184,8 @@ const char* get_hostname(); // resolve to the same file as `path`. std::string get_relative_path(std::string_view dir, std::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"