]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Remove now superfluous size check of uncompressed files
authorJoel Rosdahl <joel@rosdahl.net>
Sun, 13 Oct 2019 14:28:24 +0000 (16:28 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Sat, 19 Oct 2019 10:44:54 +0000 (12:44 +0200)
Uncompressed cache files have a trailing checksum as well; this wasn’t
the case earlier in the format design process.

src/CacheEntryReader.cpp
src/ccache.hpp
src/legacy_util.cpp
test/suites/base.bash
test/suites/no_compression.bash

index 8014fe8e137af2dc0df1373d1f392d88bc439017..59da8562c1c1c1c9ee5d6d64dd8a2256cf2e87fe 100644 (file)
@@ -50,21 +50,6 @@ CacheEntryReader::CacheEntryReader(FILE* stream,
     throw Error(fmt::format(
       "Unknown version (actual {}, expected {})", m_version, expected_version));
   }
-  if (m_compression_type == Compression::Type::none) {
-    // Since we have the size available, let's use it as a super primitive
-    // consistency check for the non-compressed case. (A real checksum is used
-    // for compressed data.)
-    struct stat st;
-    if (x_fstat(fileno(stream), &st) != 0) {
-      throw Error(fmt::format("Failed to fstat: {}", strerror(errno)));
-    }
-    if (static_cast<uint64_t>(st.st_size) != m_content_size) {
-      throw Error(fmt::format(
-        "Bad uncompressed file size (actual {} bytes, expected {} bytes)",
-        st.st_size,
-        m_content_size));
-    }
-  }
 
   m_checksum.update(header_bytes, sizeof(header_bytes));
   m_decompressor = Decompressor::create_from_type(m_compression_type, stream);
index 76d9ce1f9dc26170c05b7eeee7e146723f42e227..e7cfd7244e38913c2a8dcdc1bae9bfe7be89b7dd 100644 (file)
@@ -175,7 +175,6 @@ void* x_calloc(size_t nmemb, size_t size);
 void* x_realloc(void* ptr, size_t size);
 void x_setenv(const char* name, const char* value);
 void x_unsetenv(const char* name);
-int x_fstat(int fd, struct stat* buf);
 int x_lstat(const char* pathname, struct stat* buf);
 int x_stat(const char* pathname, struct stat* buf);
 void traverse(const char* dir, void (*fn)(const char*, struct stat*));
index 943175994914cb2d60b725331ed4ebc87c4a1ab5..1c5171c5004f9b874a9782b15279be6b121b40a1 100644 (file)
@@ -725,17 +725,6 @@ x_unsetenv(const char* name)
 #endif
 }
 
-// Like fstat() but also call cc_log on failure.
-int
-x_fstat(int fd, struct stat* buf)
-{
-  int result = fstat(fd, buf);
-  if (result != 0) {
-    cc_log("Failed to fstat fd %d: %s", fd, strerror(errno));
-  }
-  return result;
-}
-
 // Like lstat() but also call cc_log on failure.
 int
 x_lstat(const char* pathname, struct stat* buf)
index 827fbe154a05206edbcf355973729c684df02d8f..f8d2d9caedbabaa10c6c77096249fbe126c0fb4f 100644 (file)
@@ -267,6 +267,32 @@ base_tests() {
         test_failed "Result file seems to be uncompressed"
     fi
 
+    # -------------------------------------------------------------------------
+    TEST "Corrupt result file"
+
+    $CCACHE_COMPILE -c test1.c
+    expect_stat 'cache hit (preprocessed)' 0
+    expect_stat 'cache miss' 1
+    expect_stat 'files in cache' 1
+
+    $CCACHE_COMPILE -c test1.c
+    expect_stat 'cache hit (preprocessed)' 1
+    expect_stat 'cache miss' 1
+    expect_stat 'files in cache' 1
+
+    result_file=$(find $CCACHE_DIR -name '*.result')
+    printf foo | dd of=$result_file bs=3 count=1 seek=20 conv=notrunc >&/dev/null
+
+    $CCACHE_COMPILE -c test1.c
+    expect_stat 'cache hit (preprocessed)' 1
+    expect_stat 'cache miss' 2
+    expect_stat 'files in cache' 1
+
+    $CCACHE_COMPILE -c test1.c
+    expect_stat 'cache hit (preprocessed)' 2
+    expect_stat 'cache miss' 2
+    expect_stat 'files in cache' 1
+
     # -------------------------------------------------------------------------
     TEST "CCACHE_DISABLE"
 
index c7ff6f816a04f8d8ed30f1e8961929f3056f7b94..1ca81a63c77e9ecc82ba9594ed4a0482cdd10aed 100644 (file)
@@ -12,7 +12,7 @@ SUITE_no_compression() {
     $REAL_COMPILER -c -o reference_test.o test.c
 
     $CCACHE_COMPILE -c test.c
-    expect_stat 'cache hit (preprocessed)' 0
+    expect_stat 'cache hit (direct)' 0
     expect_stat 'cache miss' 1
     expect_stat 'files in cache' 2
     expect_equal_object_files reference_test.o test.o
@@ -51,4 +51,30 @@ SUITE_no_compression() {
     $CCACHE_COMPILE -c test.c
     expect_stat 'cache hit (direct)' 2
     expect_stat 'cache miss' 1
+
+    # -------------------------------------------------------------------------
+    TEST "Corrupt result file"
+
+    $CCACHE_COMPILE -c test.c
+    expect_stat 'cache hit (direct)' 0
+    expect_stat 'cache miss' 1
+    expect_stat 'files in cache' 2
+
+    $CCACHE_COMPILE -c test.c
+    expect_stat 'cache hit (direct)' 1
+    expect_stat 'cache miss' 1
+    expect_stat 'files in cache' 2
+
+    result_file=$(find $CCACHE_DIR -name '*.result')
+    printf foo | dd of=$result_file bs=3 count=1 seek=20 conv=notrunc >&/dev/null
+
+    $CCACHE_COMPILE -c test.c
+    expect_stat 'cache hit (direct)' 1
+    expect_stat 'cache miss' 2
+    expect_stat 'files in cache' 2
+
+    $CCACHE_COMPILE -c test.c
+    expect_stat 'cache hit (direct)' 2
+    expect_stat 'cache miss' 2
+    expect_stat 'files in cache' 2
 }