]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fixed memcpy() overlap
authorYann Collet <cyan@fb.com>
Wed, 21 Jun 2017 00:44:55 +0000 (17:44 -0700)
committerYann Collet <cyan@fb.com>
Wed, 21 Jun 2017 00:44:55 +0000 (17:44 -0700)
lib/compress/zstd_compress.c
lib/decompress/zstd_decompress.c

index e48bc41bdc034a00483e3574c819751f101405d1..4f1a0bcc4815e56ca19879826aa525bb10aeab81 100644 (file)
@@ -4017,14 +4017,13 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
 *   Size values are optional, provide 0 if not known or unused */
 ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize)
 {
-    ZSTD_compressionParameters cp;
     size_t const addedSize = srcSizeHint ? 0 : 500;
     U64 const rSize = srcSizeHint+dictSize ? srcSizeHint+dictSize+addedSize : (U64)-1;
     U32 const tableID = (rSize <= 256 KB) + (rSize <= 128 KB) + (rSize <= 16 KB);   /* intentional underflow for srcSizeHint == 0 */
     if (compressionLevel <= 0) compressionLevel = ZSTD_CLEVEL_DEFAULT;   /* 0 == default; no negative compressionLevel yet */
     if (compressionLevel > ZSTD_MAX_CLEVEL) compressionLevel = ZSTD_MAX_CLEVEL;
-    cp = ZSTD_defaultCParameters[tableID][compressionLevel];
-    return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize);   /* no need to ensure initial CParams validity */
+    { ZSTD_compressionParameters const cp = ZSTD_defaultCParameters[tableID][compressionLevel];
+      return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize); }
 }
 
 /*! ZSTD_getParams() :
index 98372f94cccfded96ed20891fca28e3dd46cdc90..51fa244ced16469ee0a45e11e2ea621fa379453f 100644 (file)
@@ -2306,14 +2306,13 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
                     break;
             }   }
 
-            /* Consume header */
+            /* Consume header (see ZSTDds_decodeFrameHeader) */
             CHECK_F(ZSTD_decompressBegin_usingDDict(zds, zds->ddict));
-            {   size_t const h1Size = ZSTD_nextSrcSizeToDecompress(zds);  /* == ZSTD_frameHeaderSize_prefix */
-                CHECK_F(ZSTD_decompressContinue(zds, NULL, 0, zds->headerBuffer, h1Size));
-                {   size_t const h2Size = ZSTD_nextSrcSizeToDecompress(zds);
-                    CHECK_F(ZSTD_decompressContinue(zds, NULL, 0, zds->headerBuffer+h1Size, h2Size));
-            }   }
+            CHECK_F(ZSTD_decodeFrameHeader(zds, zds->headerBuffer, zds->lhSize));
+            zds->expected = ZSTD_blockHeaderSize;
+            zds->stage = ZSTDds_decodeBlockHeader;
 
+            /* control buffer memory usage */
             zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN);
             if (zds->fParams.windowSize > zds->maxWindowSize) return ERROR(frameParameter_windowTooLarge);