From: Nick Terrell Date: Tue, 4 Apr 2017 04:00:44 +0000 (-0700) Subject: Make ZSTD_compress_usingCDict() respect contentSizeFlag X-Git-Tag: v1.2.0^2~66^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=39a6cc5172ef32e8afc115fa2144d9cd23837df3;p=thirdparty%2Fzstd.git Make ZSTD_compress_usingCDict() respect contentSizeFlag --- diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 03b9758e8..21f31b756 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2921,6 +2921,8 @@ size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, if (cdict->refContext->params.fParams.contentSizeFlag==1) { cctx->params.fParams.contentSizeFlag = 1; cctx->frameContentSize = srcSize; + } else { + cctx->params.fParams.contentSizeFlag = 0; } return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize); diff --git a/tests/fuzzer.c b/tests/fuzzer.c index fed875843..342c953e9 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -404,6 +404,39 @@ static int basicUnitTests(U32 seed, double compressibility) if (r != CNBuffSize) goto _output_error); DISPLAYLEVEL(4, "OK \n"); + DISPLAYLEVEL(4, "test%3i : compress with preprocessed dictionary : ", testNb++); + { ZSTD_parameters params = ZSTD_getParams(1, CNBuffSize, dictSize); + params.fParams.contentSizeFlag = 0; + { ZSTD_customMem customMem = { NULL, NULL, NULL }; + ZSTD_CDict* cdict = ZSTD_createCDict_advanced(dictBuffer, dictSize, 1, params, customMem); + cSize = ZSTD_compress_usingCDict(cctx, compressedBuffer, ZSTD_compressBound(CNBuffSize), + CNBuffer, CNBuffSize, cdict); + ZSTD_freeCDict(cdict); + if (ZSTD_isError(cSize)) goto _output_error; + } + } + DISPLAYLEVEL(4, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/CNBuffSize*100); + + DISPLAYLEVEL(4, "test%3i : retrieve dictID from frame : ", testNb++); + { U32 const did = ZSTD_getDictID_fromFrame(compressedBuffer, cSize); + if (did != dictID) goto _output_error; /* non-conformant (content-only) dictionary */ + } + DISPLAYLEVEL(4, "OK \n"); + + DISPLAYLEVEL(4, "test%3i : frame should not have content size : ", testNb++); + { unsigned long long const contentSize = ZSTD_findDecompressedSize(compressedBuffer, cSize); + if (contentSize != ZSTD_CONTENTSIZE_UNKNOWN) goto _output_error; /* cdict contentSizeFlag not used */ + } + DISPLAYLEVEL(4, "OK \n"); + + DISPLAYLEVEL(4, "test%3i : frame built with dictionary should be decompressible : ", testNb++); + CHECKPLUS(r, ZSTD_decompress_usingDict(dctx, + decodedBuffer, CNBuffSize, + compressedBuffer, cSize, + dictBuffer, dictSize), + if (r != CNBuffSize) goto _output_error); + DISPLAYLEVEL(4, "OK \n"); + DISPLAYLEVEL(4, "test%3i : compress without dictID : ", testNb++); { ZSTD_parameters p = ZSTD_getParams(3, CNBuffSize, dictSize); p.fParams.noDictIDFlag = 1;