]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
protect ZSTD_decodeFrameHeader() from invalid usage, as suggested by @spaskob
authorYann Collet <cyan@fb.com>
Fri, 21 Oct 2016 03:11:00 +0000 (20:11 -0700)
committerYann Collet <cyan@fb.com>
Fri, 21 Oct 2016 03:11:00 +0000 (20:11 -0700)
lib/decompress/zstd_decompress.c

index 00b069e9fdd8a7f8cef22fd52ec36e216ce750c7..886a2a477f89ce4198018ebcb0969dc7909888c6 100644 (file)
@@ -301,14 +301,16 @@ unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize)
 
 
 /** ZSTD_decodeFrameHeader() :
-*   `srcSize` must be the size provided by ZSTD_frameHeaderSize().
+*   `headerSize` must be the size provided by ZSTD_frameHeaderSize().
 *   @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
-static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t srcSize)
+static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t headerSize)
 {
-    size_t const result = ZSTD_getFrameParams(&(dctx->fParams), src, srcSize);
+    size_t const result = ZSTD_getFrameParams(&(dctx->fParams), src, headerSize);
+    if (ZSTD_isError(result)) return result;  /* invalid header */
+    if (result>0) return ERROR(srcSize_wrong);   /* headerSize too small */
     if (dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID)) return ERROR(dictionary_wrong);
     if (dctx->fParams.checksumFlag) XXH64_reset(&dctx->xxhState, 0);
-    return result;
+    return 0;
 }