diff --git a/lib/cmp_chunk.h b/lib/cmp_chunk.h index 472e8b0db52eb1b0af80306a77a82879738cbd2a..4c5f5183450b2302f30e098b7e6d2176e0b14970 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 21f22e26efca8d58e0f8a62f21517ff53e1f7c29..4b8f3e9f6d788dbee4289c25931897e1e291796b 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++;