]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
fix: Use correct umask when populating primary cache from secondary
authorJoel Rosdahl <joel@rosdahl.net>
Tue, 7 Jun 2022 14:53:44 +0000 (16:53 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Sat, 20 Aug 2022 11:33:12 +0000 (13:33 +0200)
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)

src/Util.cpp
src/Util.hpp
test/suites/secondary_file.bash

index abbf76d3e5e5ad9d479f88ddc90a768622115ddb..8898337f165017b4f20f315c32bc861d71183c6f 100644 (file)
@@ -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)
index 4ddffa346adec6af44837604bd37b27e44965a65..d0c58b8697138e95730a9dbe5fdea2c8dd56ace5 100644 (file)
@@ -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);
index 3c539874f224da7e4ad3d16860363bd9787d5534..1a6886259f51c6d7331f9de63a272a6339f0c3a6 100644 (file)
@@ -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"