From: Yann Collet Date: Fri, 7 Jul 2017 22:32:12 +0000 (-0700) Subject: ZSTD_getFrameHeader : control of windowSize limits is delegated to caller X-Git-Tag: v1.3.1^2~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46396523c0d50cf57f05237281cf1bb19049788f;p=thirdparty%2Fzstd.git ZSTD_getFrameHeader : control of windowSize limits is delegated to caller Extracting frame header is a separate operation. It's now possible to get frame header, whatever the window size set in it. --- diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index b1048da0e..87e60170e 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -321,7 +321,6 @@ size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t src U32 const checksumFlag = (fhdByte>>2)&1; U32 const singleSegment = (fhdByte>>5)&1; U32 const fcsID = fhdByte>>6; - U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX; U64 windowSize = 0; U32 dictID = 0; U64 frameContentSize = ZSTD_CONTENTSIZE_UNKNOWN; @@ -359,8 +358,6 @@ size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t src zfhPtr->windowSize = windowSize; zfhPtr->dictID = dictID; zfhPtr->checksumFlag = checksumFlag; - if (windowSize > windowSizeMax) - return ERROR(frameParameter_windowTooLarge); /* should windowSizeMax control be delegated to caller ? */ } return 0; } @@ -2254,10 +2251,13 @@ size_t ZSTD_estimateDStreamSize(size_t windowSize) ZSTDLIB_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize) { + U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX; ZSTD_frameHeader zfh; size_t const err = ZSTD_getFrameHeader(&zfh, src, srcSize); if (ZSTD_isError(err)) return err; if (err>0) return ERROR(srcSize_wrong); + if (zfh.windowSize > windowSizeMax) + return ERROR(frameParameter_windowTooLarge); return ZSTD_estimateDStreamSize(zfh.windowSize); }