From: Yann Collet Date: Tue, 11 Dec 2018 01:33:49 +0000 (-0800) Subject: fixed ZSTD_compress2() X-Git-Tag: v1.3.8~33^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c226a7b9f32c0ca02fed147a6152e09c1fc8063f;p=thirdparty%2Fzstd.git fixed ZSTD_compress2() as suggested by @terrelln --- diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 3b84e1b5c..3d6ed47eb 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -4060,19 +4060,21 @@ size_t ZSTD_compress2(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize) { - size_t oPos = 0; - size_t iPos = 0; - size_t const result = ZSTD_compressStream2_simpleArgs(cctx, - dst, dstCapacity, &oPos, - src, srcSize, &iPos, - ZSTD_e_end); - assert(iPos == srcSize); - if (ZSTD_isError(result)) return result; - if (result != 0) { /* compression not completed, due to lack of output space */ - assert(oPos == dstCapacity); - return ERROR(dstSize_tooSmall); + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only); + { size_t oPos = 0; + size_t iPos = 0; + size_t const result = ZSTD_compressStream2_simpleArgs(cctx, + dst, dstCapacity, &oPos, + src, srcSize, &iPos, + ZSTD_e_end); + if (ZSTD_isError(result)) return result; + assert(iPos == srcSize); + if (result != 0) { /* compression not completed, due to lack of output space */ + assert(oPos == dstCapacity); + return ERROR(dstSize_tooSmall); + } + return oPos; } - return oPos; } /*====== Finalize ======*/ diff --git a/lib/zstd.h b/lib/zstd.h index 72289d99d..0de81f3ac 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -750,6 +750,8 @@ ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset); /*! ZSTD_compress2() : * Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API. + * ZSTD_compress2() always starts a new frame. + * Should cctx hold data from a previously unfinished frame, everything about it is forgotten. * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() * - The function is always blocking, returns when compression is completed. * Hint : compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`.