]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fixed context copy
authorYann Collet <yann.collet.73@gmail.com>
Thu, 7 Jan 2016 22:07:44 +0000 (23:07 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Thu, 7 Jan 2016 22:07:44 +0000 (23:07 +0100)
lib/error.h
lib/zstd_compress.c

index 3c39c39ca8216f5f4bc573fb8e1c3af6e4cbfcc2..af3c1b5691d6cc084a6845fb7f58113c40a0c342 100644 (file)
@@ -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)) \
index 4044ac741eced9d6448b6a1b724183eede624c00..c167d782402e6b144d291da808fd5da9f44b19e0 100644 (file)
@@ -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;
 }