From 98ec18e6c7154bbd60260117fc326a88711733ca Mon Sep 17 00:00:00 2001 From: Dominik Loidolt <dominik.loidolt@univie.ac.at> Date: Sun, 3 Mar 2024 12:47:07 +0100 Subject: [PATCH] Refactor compression size bound calculation --- lib/cmp_chunk.h | 19 +++++++++++++++---- lib/icu_compress/cmp_icu.c | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/cmp_chunk.h b/lib/cmp_chunk.h index 472e8b0..4c5f518 100644 --- a/lib/cmp_chunk.h +++ b/lib/cmp_chunk.h @@ -24,7 +24,14 @@ #include "common/cmp_entity.h" -#define ROUND_UP_TO_4(x) ((((x)+3)*4)/4) +#define ROUND_UP_TO_4(x) ((((x)+3)/4)*4) + +#define COMPRESS_CHUNK_BOUND_UNSAFE(chunk_size, num_col) ( \ + ROUND_UP_TO_4(NON_IMAGETTE_HEADER_SIZE + \ + (num_col) * CMP_COLLECTION_FILD_SIZE + \ + (chunk_size) \ + ) \ +) /** @@ -43,9 +50,13 @@ * @returns maximum compressed size for chunk compression; 0 on error */ -#define COMPRESS_CHUNK_BOUND(chunk_size, num_col) ( \ - (uint32_t)ROUND_UP_TO_4(NON_IMAGETTE_HEADER_SIZE+(chunk_size)+(num_col)*CMP_COLLECTION_FILD_SIZE) > (uint32_t)CMP_ENTITY_MAX_SIZE ? 0 \ - : ROUND_UP_TO_4(NON_IMAGETTE_HEADER_SIZE+(chunk_size)+(num_col)*CMP_COLLECTION_FILD_SIZE) \ +#define COMPRESS_CHUNK_BOUND(chunk_size, num_col) ( \ + (num_col) > 0 && \ + (num_col) <= CMP_ENTITY_MAX_SIZE/COLLECTION_HDR_SIZE && \ + (chunk_size) >= COLLECTION_HDR_SIZE * (num_col) && \ + (chunk_size) <= CMP_ENTITY_MAX_SIZE && \ + COMPRESS_CHUNK_BOUND_UNSAFE(chunk_size, num_col) <= CMP_ENTITY_MAX_SIZE ? \ + COMPRESS_CHUNK_BOUND_UNSAFE(chunk_size, num_col) : 0 \ ) diff --git a/lib/icu_compress/cmp_icu.c b/lib/icu_compress/cmp_icu.c index 21f22e2..4b8f3e9 100644 --- a/lib/icu_compress/cmp_icu.c +++ b/lib/icu_compress/cmp_icu.c @@ -2737,7 +2737,7 @@ uint32_t compress_chunk_cmp_size_bound(const void *chunk, size_t chunk_size) } for (read_bytes = 0; - read_bytes < (int32_t)chunk_size-COLLECTION_HDR_SIZE; + read_bytes <= (int32_t)chunk_size-COLLECTION_HDR_SIZE; read_bytes += cmp_col_get_size((const struct collection_hdr *)((const uint8_t *)chunk + read_bytes))) num_col++; -- GitLab