From 952f6937892b4a743c876a9ab645a8a33f1bf9bb Mon Sep 17 00:00:00 2001 From: TapTap Date: Mon, 20 Jul 2026 14:27:20 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20address=20re-review=20=E2=80=94=20covera?= =?UTF-8?q?ge=20build,=20chunk=20OOB=20guard,=20UBSan=20loads,=20srand=20s?= =?UTF-8?q?cope?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove -DSTRICT_WARNINGS=ON from coverage job (_FORTIFY_SOURCE + -O0 + -Werror fatal) - Fix chunk.c metadata guard: peek at present flag before calling metadata_from_buf so the remaining_size check covers the full sizeof(int)+FILE_METADATA_WIRE_SIZE - Fix chunk.c UBSan misaligned loads: use memcpy instead of *(size_t*)deref - Move srand(42) to test_property() top level so all property tests are seeded --- .gitea/workflows/ci.yaml | 2 +- src/shared/chunk.c | 24 +++++++++++++----------- tests/test_property.c | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 7ab131e..f9354f1 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -79,7 +79,7 @@ jobs: uses: actions/checkout@v4 - name: Configure - run: cmake -B build -S . -DENABLE_COVERAGE=ON -DSTRICT_WARNINGS=ON + run: cmake -B build -S . -DENABLE_COVERAGE=ON - name: Build run: cmake --build build -j$(nproc) diff --git a/src/shared/chunk.c b/src/shared/chunk.c index 0bd0720..6c5adbd 100644 --- a/src/shared/chunk.c +++ b/src/shared/chunk.c @@ -95,7 +95,8 @@ Chunk* chunk_deserialize(Data* data, bool use_metadata) { return NULL; } - size_t path_len = *(size_t*)data_pointer; + size_t path_len; + memcpy(&path_len, data_pointer, sizeof(size_t)); data_pointer += sizeof(size_t); remaining_size -= sizeof(size_t); @@ -125,18 +126,18 @@ Chunk* chunk_deserialize(Data* data, bool use_metadata) { array_list_delete(files); return NULL; } + // Peek at present flag to determine total size needed before reading + int present_flag; + memcpy(&present_flag, data_pointer, sizeof(int)); + if (present_flag && remaining_size < sizeof(int) + FILE_METADATA_WIRE_SIZE) { + log_message(LOG_LEVEL_ERROR, "Invalid chunk format: not enough data for metadata body"); + array_list_delete(files); + return NULL; + } file->metadata = metadata_from_buf(&data_pointer); remaining_size -= sizeof(int); - if (file->metadata) { - if (remaining_size < FILE_METADATA_WIRE_SIZE) { - log_message(LOG_LEVEL_ERROR, "Invalid chunk format: not enough data for metadata body"); - free(file->metadata); - file->metadata = NULL; - array_list_delete(files); - return NULL; - } + if (file->metadata) remaining_size -= FILE_METADATA_WIRE_SIZE; - } } if (remaining_size < sizeof(size_t)) { @@ -145,7 +146,8 @@ Chunk* chunk_deserialize(Data* data, bool use_metadata) { return NULL; } - size_t file_data_size = *(size_t*)data_pointer; + size_t file_data_size; + memcpy(&file_data_size, data_pointer, sizeof(size_t)); data_pointer += sizeof(size_t); remaining_size -= sizeof(size_t); diff --git a/tests/test_property.c b/tests/test_property.c index 503c85b..5840f4a 100644 --- a/tests/test_property.c +++ b/tests/test_property.c @@ -20,7 +20,6 @@ static Data* random_data(int min_size, int max_size) { } static void test_property_compress_roundtrip() { - srand(42); for (int iter = 0; iter < 10; iter++) { Data* original = random_data(1, 10000); EXPECT_NOT_NULL(original); @@ -114,6 +113,7 @@ static void test_property_chunk_roundtrip() { } void test_property() { + srand(42); test_property_compress_roundtrip(); test_property_delta_roundtrip(); test_property_chunk_roundtrip();