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++;