From 86b8134cadadc7dcfb7f9e43baa54212ea7c58c3 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Wed, 25 Oct 2017 17:10:57 -0700 Subject: [PATCH] [libzstd] Fix parameter selection for empty input ZSTD_compress() and friends would treat an empty input as an unknown size when selecting parameters. Thus, they would drastically overallocate the context. Tell ZSTD_getParams() that the source size is 1 when it is empty. --- lib/compress/zstd_compress.c | 2 +- tests/fuzzer.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 635cc665c..21b84d104 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2213,7 +2213,7 @@ size_t ZSTD_compress_advanced_internal( size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, const void* dict, size_t dictSize, int compressionLevel) { - ZSTD_parameters params = ZSTD_getParams(compressionLevel, srcSize, dict ? dictSize : 0); + ZSTD_parameters params = ZSTD_getParams(compressionLevel, srcSize ? srcSize : 1, dict ? dictSize : 0); params.fParams.contentSizeFlag = 1; return ZSTD_compress_internal(ctx, dst, dstCapacity, src, srcSize, dict, dictSize, params); } diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 76df77af9..e40f19978 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -359,6 +359,14 @@ static int basicUnitTests(U32 seed, double compressibility) if (ZSTD_getErrorCode(r) != ZSTD_error_srcSize_wrong) goto _output_error; } DISPLAYLEVEL(4, "OK \n"); + DISPLAYLEVEL(4, "test%di : check CCtx size after compressing empty input : ", testNb++); + { ZSTD_CCtx* cctx = ZSTD_createCCtx(); + size_t const r = ZSTD_compressCCtx(cctx, compressedBuffer, compressedBufferSize, NULL, 0, 19); + if (ZSTD_isError(r)) goto _output_error; + if (ZSTD_sizeof_CCtx(cctx) > (1U << 20)) goto _output_error; + ZSTD_freeCCtx(cctx); + } + DISPLAYLEVEL(4, "OK \n"); /* Static CCtx tests */ #define STATIC_CCTX_LEVEL 3 -- 2.47.2