From 6e1c4c6c6533bb09969c68d3d25b13ba12fe9a8f Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 7 Jan 2016 23:07:44 +0100 Subject: [PATCH] fixed context copy --- lib/error.h | 2 +- lib/zstd_compress.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/error.h b/lib/error.h index 3c39c39ca..af3c1b569 100644 --- a/lib/error.h +++ b/lib/error.h @@ -69,7 +69,7 @@ extern "C" { #define ERROR_LIST(ITEM) \ ITEM(PREFIX(No_Error)) ITEM(PREFIX(GENERIC)) \ ITEM(PREFIX(prefix_unknown)) ITEM(PREFIX(frameParameter_unsupported)) ITEM(PREFIX(frameParameter_unsupportedBy32bitsImplementation)) \ - ITEM(PREFIX(init_missing)) ITEM(PREFIX(memory_allocation)) \ + ITEM(PREFIX(init_missing)) ITEM(PREFIX(memory_allocation)) ITEM(PREFIX(stage_wrong)) \ ITEM(PREFIX(dstSize_tooSmall)) ITEM(PREFIX(srcSize_wrong)) \ ITEM(PREFIX(corruption_detected)) \ ITEM(PREFIX(tableLog_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooSmall)) \ diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index 4044ac741..c167d7824 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -1963,11 +1963,17 @@ size_t ZSTD_duplicateCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx) { void* dstWorkSpace = dstCCtx->workSpace; size_t dstWorkSpaceSize = dstCCtx->workSpaceSize; + const U32 contentLog = (srcCCtx->params.strategy == ZSTD_fast) ? 1 : srcCCtx->params.contentLog; + const size_t tableSpace = ((1 << contentLog) + (1 << srcCCtx->params.hashLog)) * sizeof(U32); + const size_t blockSize = MIN(BLOCKSIZE, (size_t)1 << srcCCtx->params.windowLog); + const size_t neededSpace = tableSpace + (3*blockSize); - if (dstWorkSpaceSize < srcCCtx->workSpaceSize) + if (srcCCtx->stage!=0) return ERROR(stage_wrong); + + if (dstWorkSpaceSize < neededSpace) { - free(dstCCtx->workSpace); - dstWorkSpaceSize = srcCCtx->workSpaceSize; + free(dstWorkSpace); + dstWorkSpaceSize = neededSpace; dstWorkSpace = malloc(dstWorkSpaceSize); if (dstWorkSpace==NULL) return ERROR(memory_allocation); } @@ -1976,6 +1982,8 @@ size_t ZSTD_duplicateCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx) dstCCtx->workSpace = dstWorkSpace; dstCCtx->workSpaceSize = dstWorkSpaceSize; + memcpy(dstWorkSpace, srcCCtx->workSpace, tableSpace); + return 0; } -- 2.47.2