diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index 325f0b54dfc..4c7cf14ecd8 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -429,10 +429,13 @@ static size_t ZSTD_frameHeaderSize_internal(const void* src, size_t srcSize, ZST /** ZSTD_frameHeaderSize() : * srcSize must be >= ZSTD_frameHeaderSize_prefix. - * @return : size of the Frame Header, + * @return : size of the Frame Header (ZSTD_SKIPPABLEHEADERSIZE for a skippable frame), * or an error code (if srcSize is too small) */ size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize) { + RETURN_ERROR_IF(srcSize < ZSTD_FRAMEHEADERSIZE_PREFIX(ZSTD_f_zstd1), srcSize_wrong, ""); + if (ZSTD_isSkippableFrame(src, srcSize)) + return ZSTD_SKIPPABLEHEADERSIZE; /* magic number + frame size */ return ZSTD_frameHeaderSize_internal(src, srcSize, ZSTD_f_zstd1); } diff --git a/lib/zstd.h b/lib/zstd.h index 97fef316fd6..3946ce17bce 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -1503,7 +1503,7 @@ ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size /*! ZSTD_frameHeaderSize() : * srcSize must be large enough, aka >= ZSTD_FRAMEHEADERSIZE_PREFIX. - * @return : size of the Frame Header, + * @return : size of the Frame Header (ZSTD_SKIPPABLEHEADERSIZE for a skippable frame), * or an error code (if srcSize is too small) */ ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 32360b9a58d..32aa77dd992 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -4702,6 +4702,11 @@ static int basicUnitTests(U32 const seed, double compressibility) CHECK(zfh.frameContentSize == skippableFrameSize - ZSTD_SKIPPABLEHEADERSIZE); } DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : ZSTD_frameHeaderSize on skippable frame : ", testNb++); + CHECK_EQ(ZSTD_frameHeaderSize(skippableFrame, skippableFrameSize), ZSTD_SKIPPABLEHEADERSIZE); + CHECK_EQ(ZSTD_frameHeaderSize(skippableFrame, ZSTD_FRAMEHEADERSIZE_PREFIX(ZSTD_f_zstd1)), ZSTD_SKIPPABLEHEADERSIZE); + DISPLAYLEVEL(3, "OK \n"); } /* error string tests */