@@ -343,6 +343,21 @@ unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize)
343
343
} }
344
344
}
345
345
346
+ static size_t readSkippableFrameSize (void const * src , size_t srcSize )
347
+ {
348
+ size_t const skippableHeaderSize = ZSTD_SKIPPABLEHEADERSIZE ;
349
+ U32 sizeU32 ;
350
+
351
+ if (srcSize < ZSTD_SKIPPABLEHEADERSIZE )
352
+ return ERROR (srcSize_wrong );
353
+
354
+ sizeU32 = MEM_readLE32 ((BYTE const * )src + ZSTD_FRAMEIDSIZE );
355
+ if ((U32 )(sizeU32 + ZSTD_SKIPPABLEHEADERSIZE ) < sizeU32 )
356
+ return ERROR (frameParameter_unsupported );
357
+
358
+ return skippableHeaderSize + sizeU32 ;
359
+ }
360
+
346
361
/** ZSTD_findDecompressedSize() :
347
362
* compatible with legacy mode
348
363
* `srcSize` must be the exact length of some number of ZSTD compressed and/or
@@ -356,11 +371,9 @@ unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize)
356
371
U32 const magicNumber = MEM_readLE32 (src );
357
372
358
373
if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK ) == ZSTD_MAGIC_SKIPPABLE_START ) {
359
- size_t skippableSize ;
360
- if (srcSize < ZSTD_SKIPPABLEHEADERSIZE )
361
- return ERROR (srcSize_wrong );
362
- skippableSize = MEM_readLE32 ((const BYTE * )src + ZSTD_FRAMEIDSIZE )
363
- + ZSTD_SKIPPABLEHEADERSIZE ;
374
+ size_t const skippableSize = readSkippableFrameSize (src , srcSize );
375
+ if (ZSTD_isError (skippableSize ))
376
+ return skippableSize ;
364
377
if (srcSize < skippableSize ) {
365
378
return ZSTD_CONTENTSIZE_ERROR ;
366
379
}
@@ -436,7 +449,7 @@ size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
436
449
#endif
437
450
if ( (srcSize >= ZSTD_SKIPPABLEHEADERSIZE )
438
451
&& (MEM_readLE32 (src ) & ZSTD_MAGIC_SKIPPABLE_MASK ) == ZSTD_MAGIC_SKIPPABLE_START ) {
439
- return ZSTD_SKIPPABLEHEADERSIZE + MEM_readLE32 (( const BYTE * ) src + ZSTD_FRAMEIDSIZE );
452
+ return readSkippableFrameSize ( src , srcSize );
440
453
} else {
441
454
const BYTE * ip = (const BYTE * )src ;
442
455
const BYTE * const ipstart = ip ;
@@ -660,11 +673,9 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
660
673
DEBUGLOG (4 , "reading magic number %08X (expecting %08X)" ,
661
674
(U32 )magicNumber , (U32 )ZSTD_MAGICNUMBER );
662
675
if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK ) == ZSTD_MAGIC_SKIPPABLE_START ) {
663
- size_t skippableSize ;
664
- if (srcSize < ZSTD_SKIPPABLEHEADERSIZE )
665
- return ERROR (srcSize_wrong );
666
- skippableSize = MEM_readLE32 ((const BYTE * )src + ZSTD_FRAMEIDSIZE )
667
- + ZSTD_SKIPPABLEHEADERSIZE ;
676
+ size_t const skippableSize = readSkippableFrameSize (src , srcSize );
677
+ if (ZSTD_isError (skippableSize ))
678
+ return skippableSize ;
668
679
if (srcSize < skippableSize ) return ERROR (srcSize_wrong );
669
680
670
681
src = (const BYTE * )src + skippableSize ;
0 commit comments