From 33fc0ad56a624bbeaf54796e82aaa356d1e13929 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Tue, 4 Apr 2017 11:52:49 -0700 Subject: [PATCH] Fix ZSTD_createCStream_usingCDict() and ZSTD_compress_usingCDict() --- contrib/linux-kernel/include/zstd.h | 2 +- contrib/linux-kernel/lib/zstd_compress.c | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/contrib/linux-kernel/include/zstd.h b/contrib/linux-kernel/include/zstd.h index fde75127..9d8fc8e0 100644 --- a/contrib/linux-kernel/include/zstd.h +++ b/contrib/linux-kernel/include/zstd.h @@ -257,7 +257,7 @@ size_t ZSTD_DStreamWorkspaceBound(size_t maxWindowSize); typedef struct ZSTD_CStream_s ZSTD_CStream; /*===== ZSTD_CStream management functions =====*/ ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(ZSTD_parameters params, unsigned long long pledgedSrcSize, void* workspace, size_t workspaceSize); -ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream_usingCDict(ZSTD_parameters params, const ZSTD_CDict* cdict, unsigned long long pledgedSrcSize, void* workspace, size_t workspaceSize); +ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream_usingCDict(const ZSTD_CDict* cdict, unsigned long long pledgedSrcSize, void* workspace, size_t workspaceSize); /*===== Streaming compression functions =====*/ ZSTDLIB_API size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); /**< re-use compression parameters from previous init; skip dictionary loading stage; zcs must be init at least once before. note: pledgedSrcSize must be correct, a size of 0 means unknown. for a frame size of 0 use initCStream_advanced */ diff --git a/contrib/linux-kernel/lib/zstd_compress.c b/contrib/linux-kernel/lib/zstd_compress.c index f91f9f01..e57cd6ba 100644 --- a/contrib/linux-kernel/lib/zstd_compress.c +++ b/contrib/linux-kernel/lib/zstd_compress.c @@ -2861,6 +2861,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); @@ -3015,12 +3017,15 @@ ZSTD_CStream* ZSTD_createCStream(ZSTD_parameters params, unsigned long long pled return zcs; } -ZSTD_CStream* ZSTD_createCStream_usingCDict(ZSTD_parameters params, const ZSTD_CDict* cdict, unsigned long long pledgedSrcSize, void* workspace, size_t workspaceSize) +ZSTD_CStream* ZSTD_createCStream_usingCDict(const ZSTD_CDict* cdict, unsigned long long pledgedSrcSize, void* workspace, size_t workspaceSize) { + ZSTD_parameters const params = ZSTD_getParamsFromCDict(cdict); ZSTD_CStream* const zcs = ZSTD_createCStream(params, pledgedSrcSize, workspace, workspaceSize); if (zcs) { zcs->cdict = cdict; - zcs->cctx->dictID = params.fParams.noDictIDFlag ? 0 : cdict->refContext->dictID; + if (ZSTD_isError(ZSTD_resetCStream_internal(zcs, pledgedSrcSize))) { + return NULL; + } } return zcs; }