fix(p7-output-fs): address c-review (fake-super mode sanitization HIGH; sparse/preallocate precedence; partial no_replace guard; stronger tests)

- fake_super_restore_fd now sanitizes mode like metadata_mode (never grants
  S_IWGRP|S_IWOTH; 0666 -> 0644), fixing a privilege regression
- --sparse takes precedence over --preallocate (skip posix_fallocate when
  sparse) so holes are not re-allocated; docs corrected
- --partial retention disabled under --no_replace (ignore/existing) and only
  marks write_attempted after the write begins (no empty-temp retention)
- accept --block-size=SIZE / --delta-block=SIZE inline forms; neutral messages
- fake-super EPERM/EACCES skipped silently (docs aligned); EINVAL still logged
- sparse unit test now memcmp's the full buffer; TestBlockSize integration keeps
  the destination basis so delta is genuinely exercised
- unit 37/37, cppcheck 0, clang-format 0
This commit is contained in:
2026-09-12 09:55:40 +02:00
parent 47de05d215
commit f2ba8211ce
9 changed files with 83 additions and 38 deletions
+6 -10
View File
@@ -1244,14 +1244,15 @@ static void test_file_write_to_disk_sparse_preserves_holes() {
}
EXPECT_TRUE(file_store_write_secure(path, buf, size, false, true, NULL, false));
free(buf);
/* Logical size must equal data_size exactly. */
struct stat st;
EXPECT_EQ_INT(stat(path, &st), 0);
EXPECT_EQ_INT((int)st.st_size, (int)size);
/* Content must round-trip exactly. */
/* Content must round-trip exactly: the full readback must equal the original
buffer byte-for-byte (header, the hole region staying zero, and tail) —
a writer bug in the lseek-offset bookkeeping would show up here. */
int fd = open(path, O_RDONLY);
EXPECT_TRUE(fd >= 0);
/* cppcheck-suppress knownConditionTrueFalse -- EXPECT_TRUE above asserts,
@@ -1267,14 +1268,8 @@ static void test_file_write_to_disk_sparse_preserves_holes() {
got += (unsigned long long)n;
}
EXPECT_EQ_INT((int)got, (int)size);
if (got == size) {
/* The middle hole region stays all-zero. */
for (unsigned long long i = 4096; i < size - 4096; i++)
if (readback[i] != 0) {
EXPECT_EQ_INT(0, 1);
break;
}
}
if (got == size)
EXPECT_EQ_INT(memcmp(readback, buf, size), 0);
free(readback);
}
/* Tolerant sparseness check: seek for holes; skip if unsupported. */
@@ -1288,6 +1283,7 @@ static void test_file_write_to_disk_sparse_preserves_holes() {
}
close(fd);
}
free(buf);
unlink(path);
}