From: Yann Collet Date: Fri, 16 Dec 2022 23:58:25 +0000 (-0800) Subject: make ZSTD_DECOMPRESSBOUND() compatible with input size 0 X-Git-Tag: v1.5.4^2~97^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F3373%2Fhead;p=thirdparty%2Fzstd.git make ZSTD_DECOMPRESSBOUND() compatible with input size 0 for environments with stringent compilation warnings. --- diff --git a/lib/zstd.h b/lib/zstd.h index 065a1d652..09a200af2 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -228,7 +228,7 @@ ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize) * Will produce constant value 0 if srcSize too large. */ #define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00LLU : 0xFF00FF00U) -#define ZSTD_COMPRESSBOUND(srcSize) (((size_t)(srcSize) > ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ +#define ZSTD_COMPRESSBOUND(srcSize) (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */ /* ZSTD_isError() : * Most ZSTD_* functions returning a size_t value can be tested for error, diff --git a/tests/fuzzer.c b/tests/fuzzer.c index c33228523..9d1862077 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -494,10 +494,8 @@ static void test_decompressBound(int tnb) char cBuffer[ZSTD_COMPRESSBOUND(sizeof(example))]; size_t const cSize = ZSTD_compress(cBuffer, sizeof(cBuffer), example, sizeof(example), 0); CHECK_Z(cSize); - { size_t const dbSize = ZSTD_decompressBound(cBuffer, cSize); - CHECK_Z(dbSize); - CHECK_EQ(dbSize, sizeof(example)); - } } + CHECK_EQ(ZSTD_decompressBound(cBuffer, cSize), (unsigned long long)sizeof(example)); + } // Simple small compression without size : should provide 1 block size { char cBuffer[ZSTD_COMPRESSBOUND(0)];