From: Nick Terrell Date: Thu, 26 Oct 2017 00:10:57 +0000 (-0700) Subject: [libzstd] Fix parameter selection for empty input X-Git-Tag: v1.3.3^2~46^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F903%2Fhead;p=thirdparty%2Fzstd.git [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. --- 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