Skip to content

Commit 03cb211

Browse files
authored
Merge pull request #271 from juntyr/patch-1
Fix zfp_stream_maximum_size overflow on 32bit target
2 parents 7d1e3a2 + 3389126 commit 03cb211

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

src/zfp.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,7 @@ zfp_stream_maximum_size(const zfp_stream* zfp, const zfp_field* field)
744744
size_t blocks = zfp_field_blocks(field);
745745
uint values = 1u << (2 * dims);
746746
uint maxbits = 0;
747+
bitstream_size maxsize;
747748

748749
if (!dims)
749750
return 0;
@@ -766,7 +767,13 @@ zfp_stream_maximum_size(const zfp_stream* zfp, const zfp_field* field)
766767
maxbits += values - 1 + values * MIN(zfp->maxprec, zfp_field_precision(field));
767768
maxbits = MIN(maxbits, zfp->maxbits);
768769
maxbits = MAX(maxbits, zfp->minbits);
769-
return ((ZFP_HEADER_MAX_BITS + blocks * maxbits + stream_word_bits - 1) & ~(stream_word_bits - 1)) / CHAR_BIT;
770+
771+
maxsize = ((ZFP_HEADER_MAX_BITS + ((bitstream_size)blocks) * maxbits + stream_word_bits - 1) & ~(stream_word_bits - 1)) / CHAR_BIT;
772+
773+
/* check if the maxsize fits into size_t to avoid silent truncation */
774+
if (((size_t)maxsize) != maxsize)
775+
return 0;
776+
return (size_t)maxsize;
770777
}
771778

772779
void

0 commit comments

Comments
 (0)