diff options
| author | thegeorg <[email protected]> | 2023-02-27 12:38:58 +0300 | 
|---|---|---|
| committer | thegeorg <[email protected]> | 2023-02-27 12:38:58 +0300 | 
| commit | e82ffade6959fe8feaf41fe12a57d9f56873be40 (patch) | |
| tree | 784bf61d9ca6cab4beabc995186d9b41e762ae60 /contrib/libs/zstd/lib/legacy | |
| parent | e58cceed352de42c1526ab4eecdfeee158b1ede3 (diff) | |
Update contrib/libs/zstd to 1.5.4
Diffstat (limited to 'contrib/libs/zstd/lib/legacy')
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_legacy.h | 9 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v01.c | 63 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v01.h | 2 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v02.c | 85 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v02.h | 2 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v03.c | 89 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v03.h | 2 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v04.c | 84 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v04.h | 2 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v05.c | 104 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v05.h | 2 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v06.c | 113 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v06.h | 2 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v07.c | 101 | ||||
| -rw-r--r-- | contrib/libs/zstd/lib/legacy/zstd_v07.h | 2 | 
15 files changed, 190 insertions, 472 deletions
diff --git a/contrib/libs/zstd/lib/legacy/zstd_legacy.h b/contrib/libs/zstd/lib/legacy/zstd_legacy.h index a6f1174b82e..dd173251d34 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_legacy.h +++ b/contrib/libs/zstd/lib/legacy/zstd_legacy.h @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the @@ -242,6 +242,13 @@ MEM_STATIC ZSTD_frameSizeInfo ZSTD_findFrameSizeInfoLegacy(const void *src, size          frameSizeInfo.compressedSize = ERROR(srcSize_wrong);          frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR;      } +    /* In all cases, decompressedBound == nbBlocks * ZSTD_BLOCKSIZE_MAX. +     * So we can compute nbBlocks without having to change every function. +     */ +    if (frameSizeInfo.decompressedBound != ZSTD_CONTENTSIZE_ERROR) { +        assert((frameSizeInfo.decompressedBound & (ZSTD_BLOCKSIZE_MAX - 1)) == 0); +        frameSizeInfo.nbBlocks = (size_t)(frameSizeInfo.decompressedBound / ZSTD_BLOCKSIZE_MAX); +    }      return frameSizeInfo;  } diff --git a/contrib/libs/zstd/lib/legacy/zstd_v01.c b/contrib/libs/zstd/lib/legacy/zstd_v01.c index 23caaef5647..1a3aad07ed8 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v01.c +++ b/contrib/libs/zstd/lib/legacy/zstd_v01.c @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the @@ -190,25 +190,6 @@ typedef   signed long long  S64;  /****************************************************************  *  Memory I/O  *****************************************************************/ -/* FSE_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - *            It can generate buggy code on targets generating assembly depending on alignment. - *            But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef FSE_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */ -#  if defined(__INTEL_COMPILER) || defined(__GNUC__) || defined(__ICCARM__) -#    define FSE_FORCE_MEMORY_ACCESS 1 -#  endif -#endif -  static unsigned FSE_32bits(void)  { @@ -221,24 +202,6 @@ static unsigned FSE_isLittleEndian(void)      return one.c[0];  } -#if defined(FSE_FORCE_MEMORY_ACCESS) && (FSE_FORCE_MEMORY_ACCESS==2) - -static U16 FSE_read16(const void* memPtr) { return *(const U16*) memPtr; } -static U32 FSE_read32(const void* memPtr) { return *(const U32*) memPtr; } -static U64 FSE_read64(const void* memPtr) { return *(const U64*) memPtr; } - -#elif defined(FSE_FORCE_MEMORY_ACCESS) && (FSE_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign; - -static U16 FSE_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -static U32 FSE_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -static U64 FSE_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -#else -  static U16 FSE_read16(const void* memPtr)  {      U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -254,8 +217,6 @@ static U64 FSE_read64(const void* memPtr)      U64 val; memcpy(&val, memPtr, sizeof(val)); return val;  } -#endif /* FSE_FORCE_MEMORY_ACCESS */ -  static U16 FSE_readLE16(const void* memPtr)  {      if (FSE_isLittleEndian()) @@ -1190,7 +1151,7 @@ static size_t HUF_decompress (void* dst, size_t maxDstSize, const void* cSrc, si      zstd - standard compression library      Copyright (C) 2014-2015, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -1759,20 +1720,26 @@ static size_t ZSTD_execSequence(BYTE* op,      static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4};   /* added */      static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11};   /* subtracted */      const BYTE* const ostart = op; +    BYTE* const oLitEnd = op + sequence.litLength;      const size_t litLength = sequence.litLength;      BYTE* const endMatch = op + litLength + sequence.matchLength;    /* risk : address space overflow (32-bits) */      const BYTE* const litEnd = *litPtr + litLength; -    /* check */ +    /* checks */ +    size_t const seqLength = sequence.litLength + sequence.matchLength; + +    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); +    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); +    /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ +    if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); +      if (endMatch > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ -    if (litEnd > litLimit) return ERROR(corruption_detected); -    if (sequence.matchLength > (size_t)(*litPtr-op))  return ERROR(dstSize_tooSmall);    /* overwrite literal segment */ +    if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */ +    if (sequence.matchLength > (size_t)(*litPtr-op)) return ERROR(dstSize_tooSmall);  /* overwrite literal segment */      /* copy Literals */ -    if (((size_t)(*litPtr - op) < 8) || ((size_t)(oend-litEnd) < 8) || (op+litLength > oend-8)) -        memmove(op, *litPtr, litLength);   /* overwrite risk */ -    else -        ZSTD_wildcopy(op, *litPtr, litLength); +    ZSTD_memmove(op, *litPtr, sequence.litLength);   /* note : v0.1 seems to allow scenarios where output or input are close to end of buffer */ +      op += litLength;      *litPtr = litEnd;   /* update for next sequence */ diff --git a/contrib/libs/zstd/lib/legacy/zstd_v01.h b/contrib/libs/zstd/lib/legacy/zstd_v01.h index f777eb6e4c9..6ac876954d1 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v01.h +++ b/contrib/libs/zstd/lib/legacy/zstd_v01.h @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the diff --git a/contrib/libs/zstd/lib/legacy/zstd_v02.c b/contrib/libs/zstd/lib/legacy/zstd_v02.c index 2f473a75734..e09bb4a248c 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v02.c +++ b/contrib/libs/zstd/lib/legacy/zstd_v02.c @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the @@ -28,7 +28,7 @@     low-level memory access routines     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -115,24 +115,6 @@ extern "C" {  /****************************************************************  *  Memory I/O  *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - *            It can generate buggy code on targets generating assembly depending on alignment. - *            But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */ -#  if defined(__INTEL_COMPILER) || defined(__GNUC__) || defined(__ICCARM__) -#    define MEM_FORCE_MEMORY_ACCESS 1 -#  endif -#endif  MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; }  MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; } @@ -143,33 +125,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void)      return one.c[0];  } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. -   can sometimes prove slower */ -  MEM_STATIC U16 MEM_read16(const void* memPtr)  {      U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -190,9 +145,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)      memcpy(memPtr, &value, sizeof(value));  } -#endif /* MEM_FORCE_MEMORY_ACCESS */ - -  MEM_STATIC U16 MEM_readLE16(const void* memPtr)  {      if (MEM_isLittleEndian()) @@ -269,7 +221,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)     header file (to include)     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -433,7 +385,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)  }  /*! BIT_lookBitsFast : -*   unsafe version; only works only if nbBits >= 1 */ +*   unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)  {      const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -453,7 +405,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)  }  /*!BIT_readBitsFast : -*  unsafe version; only works only if nbBits >= 1 */ +*  unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)  {      size_t value = BIT_lookBitsFast(bitD, nbBits); @@ -510,7 +462,7 @@ MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)     Error codes and messages     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -609,7 +561,7 @@ typedef unsigned FSE_DTable;   /* don't allocate that. It's just a way to be mor     header file for static linking (only)     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -753,7 +705,7 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)     header file for static linking (only)     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -822,7 +774,7 @@ static size_t HUF_decompress4X6 (void* dst, size_t dstSize, const void* cSrc, si      Header File      Copyright (C) 2014-2015, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -882,7 +834,7 @@ typedef struct ZSTD_CCtx_s ZSTD_CCtx;   /* incomplete type */      Header File for static linking only      Copyright (C) 2014-2015, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -946,7 +898,7 @@ typedef struct ZSTD_DCtx_s ZSTD_DCtx;     FSE : Finite State Entropy coder     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1450,7 +1402,7 @@ static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, siz     Huff0 : Huffman coder, part of New Generation Entropy library     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -2609,7 +2561,7 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_      zstd - standard compression library      Copyright (C) 2014-2015, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -3114,12 +3066,19 @@ static size_t ZSTD_execSequence(BYTE* op,      const BYTE* const litEnd = *litPtr + sequence.litLength;      /* checks */ -    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ +    size_t const seqLength = sequence.litLength + sequence.matchLength; + +    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); +    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); +    /* Now we know there are no overflow in literal nor match lengths, can use the pointer check */ +    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); +    if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); +      if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */      if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */      /* copy Literals */ -    ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ +    ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */      op = oLitEnd;      *litPtr = litEnd;   /* update for next sequence */ diff --git a/contrib/libs/zstd/lib/legacy/zstd_v02.h b/contrib/libs/zstd/lib/legacy/zstd_v02.h index 1b371953b74..dab0260ee9e 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v02.h +++ b/contrib/libs/zstd/lib/legacy/zstd_v02.h @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the diff --git a/contrib/libs/zstd/lib/legacy/zstd_v03.c b/contrib/libs/zstd/lib/legacy/zstd_v03.c index 6625f4df1cb..b0d7f521ed0 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v03.c +++ b/contrib/libs/zstd/lib/legacy/zstd_v03.c @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the @@ -29,7 +29,7 @@     low-level memory access routines     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -116,24 +116,6 @@ extern "C" {  /****************************************************************  *  Memory I/O  *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - *            It can generate buggy code on targets generating assembly depending on alignment. - *            But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */ -#  if defined(__INTEL_COMPILER) || defined(__GNUC__) || defined(__ICCARM__) -#    define MEM_FORCE_MEMORY_ACCESS 1 -#  endif -#endif  MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; }  MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; } @@ -144,33 +126,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void)      return one.c[0];  } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. -   can sometimes prove slower */ -  MEM_STATIC U16 MEM_read16(const void* memPtr)  {      U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -191,10 +146,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)      memcpy(memPtr, &value, sizeof(value));  } - -#endif /* MEM_FORCE_MEMORY_ACCESS */ - -  MEM_STATIC U16 MEM_readLE16(const void* memPtr)  {      if (MEM_isLittleEndian()) @@ -271,7 +222,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)     header file (to include)     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -435,7 +386,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)  }  /*! BIT_lookBitsFast : -*   unsafe version; only works only if nbBits >= 1 */ +*   unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)  {      const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -455,7 +406,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)  }  /*!BIT_readBitsFast : -*  unsafe version; only works only if nbBits >= 1 */ +*  unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)  {      size_t value = BIT_lookBitsFast(bitD, nbBits); @@ -512,7 +463,7 @@ MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)     Error codes and messages     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -611,7 +562,7 @@ typedef unsigned FSE_DTable;   /* don't allocate that. It's just a way to be mor     header file for static linking (only)     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -755,7 +706,7 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)     header file for static linking (only)     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -823,7 +774,7 @@ static size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, si      Header File      Copyright (C) 2014-2015, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -883,7 +834,7 @@ typedef struct ZSTD_CCtx_s ZSTD_CCtx;   /* incomplete type */      Header File for static linking only      Copyright (C) 2014-2015, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -947,7 +898,7 @@ typedef struct ZSTD_DCtx_s ZSTD_DCtx;     FSE : Finite State Entropy coder     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1451,7 +1402,7 @@ static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, siz     Huff0 : Huffman coder, part of New Generation Entropy library     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -2248,7 +2199,7 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_      zstd - standard compression library      Copyright (C) 2014-2015, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -2755,18 +2706,24 @@ static size_t ZSTD_execSequence(BYTE* op,      const BYTE* const litEnd = *litPtr + sequence.litLength;      /* checks */ -    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ +    size_t const seqLength = sequence.litLength + sequence.matchLength; + +    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); +    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); +    /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ +    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); +    if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); +      if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */      if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */      /* copy Literals */ -    ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ +    ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */      op = oLitEnd;      *litPtr = litEnd;   /* update for next sequence */      /* copy Match */ -    { -        const BYTE* match = op - sequence.offset; +    {   const BYTE* match = op - sequence.offset;          /* check */          if (sequence.offset > (size_t)op) return ERROR(corruption_detected);   /* address space overflow test (this test seems kept by clang optimizer) */ diff --git a/contrib/libs/zstd/lib/legacy/zstd_v03.h b/contrib/libs/zstd/lib/legacy/zstd_v03.h index 7a00d4304ba..9bf3cce6473 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v03.h +++ b/contrib/libs/zstd/lib/legacy/zstd_v03.h @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the diff --git a/contrib/libs/zstd/lib/legacy/zstd_v04.c b/contrib/libs/zstd/lib/legacy/zstd_v04.c index 8d305c7eae9..57be832bd32 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v04.c +++ b/contrib/libs/zstd/lib/legacy/zstd_v04.c @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the @@ -87,24 +87,6 @@ extern "C" {  /****************************************************************  *  Memory I/O  *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - *            It can generate buggy code on targets generating assembly depending on alignment. - *            But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */ -#  if defined(__INTEL_COMPILER) || defined(__GNUC__) || defined(__ICCARM__) -#    define MEM_FORCE_MEMORY_ACCESS 1 -#  endif -#endif  MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; }  MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; } @@ -115,33 +97,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void)      return one.c[0];  } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. -   can sometimes prove slower */ -  MEM_STATIC U16 MEM_read16(const void* memPtr)  {      U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -162,9 +117,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)      memcpy(memPtr, &value, sizeof(value));  } -#endif /* MEM_FORCE_MEMORY_ACCESS */ - -  MEM_STATIC U16 MEM_readLE16(const void* memPtr)  {      if (MEM_isLittleEndian()) @@ -542,7 +494,7 @@ If there is an error, the function will return an error code, which can be teste     header file (to include)     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -700,7 +652,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)  }  /*! BIT_lookBitsFast : -*   unsafe version; only works only if nbBits >= 1 */ +*   unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)  {      const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -720,7 +672,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)  }  /*!BIT_readBitsFast : -*  unsafe version; only works only if nbBits >= 1 */ +*  unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)  {      size_t value = BIT_lookBitsFast(bitD, nbBits); @@ -781,7 +733,7 @@ MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)     header file for static linking (only)     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -930,7 +882,7 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)     FSE : Finite State Entropy coder     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1436,7 +1388,7 @@ static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, siz     header file     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1514,7 +1466,7 @@ static unsigned    HUF_isError(size_t code);        /* tells if a return value i     header file for static linking (only)     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1601,7 +1553,7 @@ static size_t HUF_decompress4X4_usingDTable(void* dst, size_t maxDstSize, const     Huff0 : Huffman coder, part of New Generation Entropy library     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -2401,7 +2353,7 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_      zstd - decompression module fo v0.4 legacy format      Copyright (C) 2015-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -2876,13 +2828,19 @@ static size_t ZSTD_execSequence(BYTE* op,      const BYTE* const litEnd = *litPtr + sequence.litLength;      const BYTE* match = oLitEnd - sequence.offset; -    /* check */ -    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ +    /* checks */ +    size_t const seqLength = sequence.litLength + sequence.matchLength; + +    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); +    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); +    /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ +    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); +      if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ -    if (litEnd > litLimit) return ERROR(corruption_detected);   /* risk read beyond lit buffer */ +    if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */      /* copy Literals */ -    ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ +    ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */      op = oLitEnd;      *litPtr = litEnd;   /* update for next sequence */ @@ -3283,7 +3241,7 @@ static void ZSTD_decompress_insertDictionary(ZSTD_DCtx* ctx, const void* dict, s      Buffered version of Zstd compression library      Copyright (C) 2015, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are diff --git a/contrib/libs/zstd/lib/legacy/zstd_v04.h b/contrib/libs/zstd/lib/legacy/zstd_v04.h index 66b97ab8e60..640240d624d 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v04.h +++ b/contrib/libs/zstd/lib/legacy/zstd_v04.h @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the diff --git a/contrib/libs/zstd/lib/legacy/zstd_v05.c b/contrib/libs/zstd/lib/legacy/zstd_v05.c index 795dfb410c0..93a1169f3b6 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v05.c +++ b/contrib/libs/zstd/lib/legacy/zstd_v05.c @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the @@ -19,7 +19,7 @@     low-level memory access routines     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -106,24 +106,6 @@ extern "C" {  /*-**************************************************************  *  Memory I/O  *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - *            It can generate buggy code on targets depending on alignment. - *            In some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */ -#  if defined(__INTEL_COMPILER) || defined(__GNUC__) || defined(__ICCARM__) -#    define MEM_FORCE_MEMORY_ACCESS 1 -#  endif -#endif  MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; }  MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; } @@ -134,37 +116,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void)      return one.c[0];  } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard, by lying on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } -MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } -MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; size_t st; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } -MEM_STATIC void MEM_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; } -MEM_STATIC void MEM_write64(void* memPtr, U64 value) { ((unalign*)memPtr)->u64 = value; } - -#else - -/* default method, safe and standard. -   can sometimes prove slower */ -  MEM_STATIC U16 MEM_read16(const void* memPtr)  {      U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -195,9 +146,6 @@ MEM_STATIC void MEM_write64(void* memPtr, U64 value)      memcpy(memPtr, &value, sizeof(value));  } -#endif /* MEM_FORCE_MEMORY_ACCESS */ - -  MEM_STATIC U16 MEM_readLE16(const void* memPtr)  {      if (MEM_isLittleEndian()) @@ -262,7 +210,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)      Header File for static linking only      Copyright (C) 2014-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -286,7 +234,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      You can contact the author at : -    - zstd homepage : http://www.zstd.net +    - zstd homepage : https://facebook.github.io/zstd  */  #ifndef ZSTD_STATIC_H  #define ZSTD_STATIC_H @@ -398,7 +346,7 @@ size_t ZSTDv05_decompressBlock(ZSTDv05_DCtx* dctx, void* dst, size_t dstCapacity      Header File for include      Copyright (C) 2014-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -485,7 +433,7 @@ static const size_t ZSTDv05_frameHeaderSize_min = 5;  #define FSEv05_ENCODING_DYNAMIC 3 -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12  #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */  #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */)   /* for a non-null block */ @@ -553,7 +501,7 @@ typedef struct {     header file     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -672,7 +620,7 @@ size_t FSEv05_decompress_usingDTable(void* dst, size_t dstCapacity, const void*     header file (to include)     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -826,7 +774,7 @@ MEM_STATIC size_t BITv05_lookBits(BITv05_DStream_t* bitD, U32 nbBits)  }  /*! BITv05_lookBitsFast : -*   unsafe version; only works only if nbBits >= 1 */ +*   unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BITv05_lookBitsFast(BITv05_DStream_t* bitD, U32 nbBits)  {      const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -846,7 +794,7 @@ MEM_STATIC size_t BITv05_readBits(BITv05_DStream_t* bitD, unsigned nbBits)  }  /*!BITv05_readBitsFast : -*  unsafe version; only works only if nbBits >= 1 */ +*  unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BITv05_readBitsFast(BITv05_DStream_t* bitD, unsigned nbBits)  {      size_t value = BITv05_lookBitsFast(bitD, nbBits); @@ -901,7 +849,7 @@ MEM_STATIC unsigned BITv05_endOfDStream(const BITv05_DStream_t* DStream)     header file for static linking (only)     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1051,7 +999,7 @@ MEM_STATIC unsigned FSEv05_endOfDState(const FSEv05_DState_t* DStatePtr)     FSEv05 : Finite State Entropy coder     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1537,7 +1485,7 @@ size_t FSEv05_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t     header file     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1610,7 +1558,7 @@ const char* HUFv05_getErrorName(size_t code);   /* provides error code string (u     header file, for static linking only     Copyright (C) 2013-2016, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1702,7 +1650,7 @@ size_t HUFv05_decompress1X4_usingDTable(void* dst, size_t maxDstSize, const void     Huff0 : Huffman coder, part of New Generation Entropy library     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -2547,7 +2495,7 @@ size_t HUFv05_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS      zstd - standard compression library      Copyright (C) 2014-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -2645,7 +2593,7 @@ struct ZSTDv05_DCtx_s      FSEv05_DTable LLTable[FSEv05_DTABLE_SIZE_U32(LLFSEv05Log)];      FSEv05_DTable OffTable[FSEv05_DTABLE_SIZE_U32(OffFSEv05Log)];      FSEv05_DTable MLTable[FSEv05_DTABLE_SIZE_U32(MLFSEv05Log)]; -    unsigned   hufTableX4[HUFv05_DTABLE_SIZE(HufLog)]; +    unsigned   hufTableX4[HUFv05_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)];      const void* previousDstEnd;      const void* base;      const void* vBase; @@ -2673,7 +2621,7 @@ size_t ZSTDv05_decompressBegin(ZSTDv05_DCtx* dctx)      dctx->base = NULL;      dctx->vBase = NULL;      dctx->dictEnd = NULL; -    dctx->hufTableX4[0] = HufLog; +    dctx->hufTableX4[0] = ZSTD_HUFFDTABLE_CAPACITY_LOG;      dctx->flagStaticTables = 0;      return 0;  } @@ -3234,13 +3182,19 @@ static size_t ZSTDv05_execSequence(BYTE* op,      const BYTE* const litEnd = *litPtr + sequence.litLength;      const BYTE* match = oLitEnd - sequence.offset; -    /* check */ -    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ +    /* checks */ +    size_t const seqLength = sequence.litLength + sequence.matchLength; + +    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); +    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); +    /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ +    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); +      if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ -    if (litEnd > litLimit) return ERROR(corruption_detected);   /* risk read beyond lit buffer */ +    if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */      /* copy Literals */ -    ZSTDv05_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ +    ZSTDv05_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */      op = oLitEnd;      *litPtr = litEnd;   /* update for next sequence */ @@ -3746,7 +3700,7 @@ size_t ZSTDv05_decompressBegin_usingDict(ZSTDv05_DCtx* dctx, const void* dict, s      Buffered version of Zstd compression library      Copyright (C) 2015-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are diff --git a/contrib/libs/zstd/lib/legacy/zstd_v05.h b/contrib/libs/zstd/lib/legacy/zstd_v05.h index bd423bfc1b9..2dcffc92367 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v05.h +++ b/contrib/libs/zstd/lib/legacy/zstd_v05.h @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the diff --git a/contrib/libs/zstd/lib/legacy/zstd_v06.c b/contrib/libs/zstd/lib/legacy/zstd_v06.c index ead213c4849..175f7cc4224 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v06.c +++ b/contrib/libs/zstd/lib/legacy/zstd_v06.c @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the @@ -23,7 +23,7 @@     low-level memory access routines     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -108,24 +108,6 @@ extern "C" {  /*-**************************************************************  *  Memory I/O  *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - *            It can generate buggy code on targets depending on alignment. - *            In some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */ -#  if defined(__INTEL_COMPILER) || defined(__GNUC__) || defined(__ICCARM__) -#    define MEM_FORCE_MEMORY_ACCESS 1 -#  endif -#endif  MEM_STATIC unsigned MEM_32bits(void) { return sizeof(size_t)==4; }  MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; } @@ -136,33 +118,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void)      return one.c[0];  } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard, by lying on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; size_t st; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. -   can sometimes prove slower */ -  MEM_STATIC U16 MEM_read16(const void* memPtr)  {      U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -183,9 +138,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)      memcpy(memPtr, &value, sizeof(value));  } - -#endif /* MEM_FORCE_MEMORY_ACCESS */ -  MEM_STATIC U32 MEM_swap32(U32 in)  {  #if defined(_MSC_VER)     /* Visual Studio */ @@ -281,7 +233,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)      Header File for static linking only      Copyright (C) 2014-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -305,7 +257,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      You can contact the author at : -    - zstd homepage : http://www.zstd.net +    - zstd homepage : https://facebook.github.io/zstd  */  #ifndef ZSTDv06_STATIC_H  #define ZSTDv06_STATIC_H @@ -412,7 +364,7 @@ ZSTDLIBv06_API size_t ZSTDv06_decompressBlock(ZSTDv06_DCtx* dctx, void* dst, siz      Header File for include      Copyright (C) 2014-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -479,7 +431,7 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;  #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */  #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */)   /* for a non-null block */ -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12  #define IS_HUF 0  #define IS_PCH 1 @@ -619,7 +571,7 @@ void ZSTDv06_seqToCodes(const seqStore_t* seqStorePtr, size_t const nbSeq);     Public Prototypes declaration     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -767,7 +719,7 @@ If there is an error, the function will return an error code, which can be teste     header file (to include)     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -928,7 +880,7 @@ MEM_STATIC size_t BITv06_initDStream(BITv06_DStream_t* bitD, const void* srcBuff  }  /*! BITv06_lookBitsFast() : -*   unsafe version; only works only if nbBits >= 1 */ +*   unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BITv06_lookBitsFast(const BITv06_DStream_t* bitD, U32 nbBits)  {      U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -948,7 +900,7 @@ MEM_STATIC size_t BITv06_readBits(BITv06_DStream_t* bitD, U32 nbBits)  }  /*! BITv06_readBitsFast() : -*   unsafe version; only works only if nbBits >= 1 */ +*   unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, U32 nbBits)  {      size_t const value = BITv06_lookBitsFast(bitD, nbBits); @@ -1002,7 +954,7 @@ MEM_STATIC unsigned BITv06_endOfDStream(const BITv06_DStream_t* DStream)     header file for static linking (only)     Copyright (C) 2013-2015, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1210,7 +1162,7 @@ MEM_STATIC BYTE FSEv06_decodeSymbolFast(FSEv06_DState_t* DStatePtr, BITv06_DStre     Common functions of New Generation Entropy library     Copyright (C) 2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1355,7 +1307,7 @@ size_t FSEv06_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned     FSE : Finite State Entropy decoder     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1679,7 +1631,7 @@ size_t FSEv06_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t     header file     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1749,7 +1701,7 @@ size_t HUFv06_compressBound(size_t size);       /**< maximum compressed size */     header file, for static linking only     Copyright (C) 2013-2016, Yann Collet -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1931,7 +1883,7 @@ MEM_STATIC size_t HUFv06_readStats(BYTE* huffWeight, size_t hwSize, U32* rankSta     Huffman decoder, part of New Generation Entropy library     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -2676,7 +2628,7 @@ size_t HUFv06_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS      Common functions of Zstd compression library      Copyright (C) 2015-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -2700,7 +2652,7 @@ size_t HUFv06_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      You can contact the author at : -    - zstd homepage : http://www.zstd.net/ +    - zstd homepage : https://facebook.github.io/zstd/  */ @@ -2730,7 +2682,7 @@ const char* ZBUFFv06_getErrorName(size_t errorCode) { return ERR_getErrorName(er      zstd - standard compression library      Copyright (C) 2014-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -2754,7 +2706,7 @@ const char* ZBUFFv06_getErrorName(size_t errorCode) { return ERR_getErrorName(er      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      You can contact the author at : -    - zstd homepage : http://www.zstd.net +    - zstd homepage : https://facebook.github.io/zstd  */  /* *************************************************************** @@ -2806,7 +2758,7 @@ struct ZSTDv06_DCtx_s      FSEv06_DTable LLTable[FSEv06_DTABLE_SIZE_U32(LLFSELog)];      FSEv06_DTable OffTable[FSEv06_DTABLE_SIZE_U32(OffFSELog)];      FSEv06_DTable MLTable[FSEv06_DTABLE_SIZE_U32(MLFSELog)]; -    unsigned   hufTableX4[HUFv06_DTABLE_SIZE(HufLog)]; +    unsigned   hufTableX4[HUFv06_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)];      const void* previousDstEnd;      const void* base;      const void* vBase; @@ -2834,7 +2786,7 @@ size_t ZSTDv06_decompressBegin(ZSTDv06_DCtx* dctx)      dctx->base = NULL;      dctx->vBase = NULL;      dctx->dictEnd = NULL; -    dctx->hufTableX4[0] = HufLog; +    dctx->hufTableX4[0] = ZSTD_HUFFDTABLE_CAPACITY_LOG;      dctx->flagRepeatTable = 0;      return 0;  } @@ -3370,13 +3322,19 @@ static size_t ZSTDv06_execSequence(BYTE* op,      const BYTE* const iLitEnd = *litPtr + sequence.litLength;      const BYTE* match = oLitEnd - sequence.offset; -    /* check */ -    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ +    /* checks */ +    size_t const seqLength = sequence.litLength + sequence.matchLength; + +    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); +    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); +    /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ +    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); +      if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ -    if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ +    if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */      /* copy Literals */ -    ZSTDv06_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ +    ZSTDv06_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */      op = oLitEnd;      *litPtr = iLitEnd;   /* update for next sequence */ @@ -3889,7 +3847,7 @@ size_t ZSTDv06_decompressBegin_usingDict(ZSTDv06_DCtx* dctx, const void* dict, s      Buffered version of Zstd compression library      Copyright (C) 2015-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -3913,7 +3871,7 @@ size_t ZSTDv06_decompressBegin_usingDict(ZSTDv06_DCtx* dctx, const void* dict, s      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      You can contact the author at : -    - zstd homepage : http://www.zstd.net/ +    - zstd homepage : https://facebook.github.io/zstd/  */ @@ -4035,7 +3993,8 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,                      size_t const toLoad = hSize - zbd->lhSize;   /* if hSize!=0, hSize > zbd->lhSize */                      if (ZSTDv06_isError(hSize)) return hSize;                      if (toLoad > (size_t)(iend-ip)) {   /* not enough input to load full header */ -                        memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip); +                        if (ip != NULL) +                            memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip);                          zbd->lhSize += iend-ip;                          *dstCapacityPtr = 0;                          return (hSize - zbd->lhSize) + ZSTDv06_blockHeaderSize;   /* remaining header bytes + next block header */ diff --git a/contrib/libs/zstd/lib/legacy/zstd_v06.h b/contrib/libs/zstd/lib/legacy/zstd_v06.h index 9e32b76e08d..633891010d7 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v06.h +++ b/contrib/libs/zstd/lib/legacy/zstd_v06.h @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the diff --git a/contrib/libs/zstd/lib/legacy/zstd_v07.c b/contrib/libs/zstd/lib/legacy/zstd_v07.c index 189f6ede69f..0bcd453dbfb 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v07.c +++ b/contrib/libs/zstd/lib/legacy/zstd_v07.c @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the @@ -184,7 +184,7 @@ ZSTDLIBv07_API size_t ZSTDv07_insertBlock(ZSTDv07_DCtx* dctx, const void* blockS     low-level memory access routines     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -268,24 +268,6 @@ extern "C" {  /*-**************************************************************  *  Memory I/O  *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - *            It can generate buggy code on targets depending on alignment. - *            In some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */ -#  if defined(__INTEL_COMPILER) || defined(__GNUC__) || defined(__ICCARM__) -#    define MEM_FORCE_MEMORY_ACCESS 1 -#  endif -#endif  MEM_STATIC unsigned MEM_32bits(void) { return sizeof(size_t)==4; }  MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; } @@ -296,33 +278,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void)      return one.c[0];  } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard, by lying on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; size_t st; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. -   can sometimes prove slower */ -  MEM_STATIC U16 MEM_read16(const void* memPtr)  {      U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -343,8 +298,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)      memcpy(memPtr, &value, sizeof(value));  } -#endif /* MEM_FORCE_MEMORY_ACCESS */ -  MEM_STATIC U32 MEM_swap32(U32 in)  {  #if defined(_MSC_VER)     /* Visual Studio */ @@ -439,7 +392,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)     header file (to include)     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -596,7 +549,7 @@ MEM_STATIC size_t BITv07_initDStream(BITv07_DStream_t* bitD, const void* srcBuff  }  /*! BITv07_lookBitsFast() : -*   unsafe version; only works only if nbBits >= 1 */ +*   unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BITv07_lookBitsFast(const BITv07_DStream_t* bitD, U32 nbBits)  {      U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -616,7 +569,7 @@ MEM_STATIC size_t BITv07_readBits(BITv07_DStream_t* bitD, U32 nbBits)  }  /*! BITv07_readBitsFast() : -*   unsafe version; only works only if nbBits >= 1 */ +*   unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BITv07_readBitsFast(BITv07_DStream_t* bitD, U32 nbBits)  {      size_t const value = BITv07_lookBitsFast(bitD, nbBits); @@ -670,7 +623,7 @@ MEM_STATIC unsigned BITv07_endOfDStream(const BITv07_DStream_t* DStream)     Public Prototypes declaration     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -978,7 +931,7 @@ MEM_STATIC BYTE FSEv07_decodeSymbolFast(FSEv07_DState_t* DStatePtr, BITv07_DStre     header file     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1151,7 +1104,7 @@ size_t HUFv07_decompress1X4_usingDTable(void* dst, size_t maxDstSize, const void     Common functions of New Generation Entropy library     Copyright (C) 2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1375,7 +1328,7 @@ size_t HUFv07_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,     FSE : Finite State Entropy decoder     Copyright (C) 2013-2015, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -1699,7 +1652,7 @@ size_t FSEv07_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t     Huffman decoder, part of New Generation Entropy library     Copyright (C) 2013-2016, Yann Collet. -   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)     Redistribution and use in source and binary forms, with or without     modification, are permitted provided that the following conditions are @@ -2577,7 +2530,7 @@ size_t HUFv07_decompress1X_DCtx (HUFv07_DTable* dctx, void* dst, size_t dstSize,      Common functions of Zstd compression library      Copyright (C) 2015-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -2601,7 +2554,7 @@ size_t HUFv07_decompress1X_DCtx (HUFv07_DTable* dctx, void* dst, size_t dstSize,      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      You can contact the author at : -    - zstd homepage : http://www.zstd.net/ +    - zstd homepage : https://facebook.github.io/zstd/  */ @@ -2647,7 +2600,7 @@ static void ZSTDv07_defaultFreeFunction(void* opaque, void* address)      Header File for include      Copyright (C) 2014-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -2717,7 +2670,7 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;  #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */  #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */)   /* for a non-null block */ -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12  typedef enum { lbt_huffman, lbt_repeat, lbt_raw, lbt_rle } litBlockType_t;  #define LONGNBSEQ 0x7F00 @@ -2854,7 +2807,7 @@ static const ZSTDv07_customMem defaultCustomMem = { ZSTDv07_defaultAllocFunction      zstd - standard compression library      Copyright (C) 2014-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -2878,7 +2831,7 @@ static const ZSTDv07_customMem defaultCustomMem = { ZSTDv07_defaultAllocFunction      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      You can contact the author at : -    - zstd homepage : http://www.zstd.net +    - zstd homepage : https://facebook.github.io/zstd  */  /* *************************************************************** @@ -2931,7 +2884,7 @@ struct ZSTDv07_DCtx_s      FSEv07_DTable LLTable[FSEv07_DTABLE_SIZE_U32(LLFSELog)];      FSEv07_DTable OffTable[FSEv07_DTABLE_SIZE_U32(OffFSELog)];      FSEv07_DTable MLTable[FSEv07_DTABLE_SIZE_U32(MLFSELog)]; -    HUFv07_DTable hufTable[HUFv07_DTABLE_SIZE(HufLog)];  /* can accommodate HUFv07_decompress4X */ +    HUFv07_DTable hufTable[HUFv07_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)];  /* can accommodate HUFv07_decompress4X */      const void* previousDstEnd;      const void* base;      const void* vBase; @@ -2967,7 +2920,7 @@ size_t ZSTDv07_decompressBegin(ZSTDv07_DCtx* dctx)      dctx->base = NULL;      dctx->vBase = NULL;      dctx->dictEnd = NULL; -    dctx->hufTable[0] = (HUFv07_DTable)((HufLog)*0x1000001); +    dctx->hufTable[0] = (HUFv07_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001);      dctx->litEntropy = dctx->fseEntropy = 0;      dctx->dictID = 0;      { int i; for (i=0; i<ZSTDv07_REP_NUM; i++) dctx->rep[i] = repStartValue[i]; } @@ -3599,11 +3552,14 @@ size_t ZSTDv07_execSequence(BYTE* op,      const BYTE* match = oLitEnd - sequence.offset;      /* check */ -    if ((oLitEnd>oend_w) | (oMatchEnd>oend)) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ -    if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ +    assert(oend >= op); +    if (sequence.litLength + WILDCOPY_OVERLENGTH > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); +    if (sequenceLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); +    assert(litLimit >= *litPtr); +    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected);;      /* copy Literals */ -    ZSTDv07_wildcopy(op, *litPtr, sequence.litLength);   /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ +    ZSTDv07_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength);   /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */      op = oLitEnd;      *litPtr = iLitEnd;   /* update for next sequence */ @@ -3617,7 +3573,7 @@ size_t ZSTDv07_execSequence(BYTE* op,              return sequenceLength;          }          /* span extDict & currentPrefixSegment */ -        {   size_t const length1 = dictEnd - match; +        {   size_t const length1 = (size_t)(dictEnd - match);              memmove(oLitEnd, match, length1);              op = oLitEnd + length1;              sequence.matchLength -= length1; @@ -4253,7 +4209,7 @@ ZSTDLIBv07_API size_t ZSTDv07_decompress_usingDDict(ZSTDv07_DCtx* dctx,      Buffered version of Zstd compression library      Copyright (C) 2015-2016, Yann Collet. -    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)      Redistribution and use in source and binary forms, with or without      modification, are permitted provided that the following conditions are @@ -4277,7 +4233,7 @@ ZSTDLIBv07_API size_t ZSTDv07_decompress_usingDDict(ZSTDv07_DCtx* dctx,      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      You can contact the author at : -    - zstd homepage : http://www.zstd.net/ +    - zstd homepage : https://facebook.github.io/zstd/  */ @@ -4417,7 +4373,8 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd,                  if (hSize != 0) {                      size_t const toLoad = hSize - zbd->lhSize;   /* if hSize!=0, hSize > zbd->lhSize */                      if (toLoad > (size_t)(iend-ip)) {   /* not enough input to load full header */ -                        memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip); +                        if (ip != NULL) +                            memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip);                          zbd->lhSize += iend-ip;                          *dstCapacityPtr = 0;                          return (hSize - zbd->lhSize) + ZSTDv07_blockHeaderSize;   /* remaining header bytes + next block header */ diff --git a/contrib/libs/zstd/lib/legacy/zstd_v07.h b/contrib/libs/zstd/lib/legacy/zstd_v07.h index bc35cfa6a33..1ff39041f88 100644 --- a/contrib/libs/zstd/lib/legacy/zstd_v07.h +++ b/contrib/libs/zstd/lib/legacy/zstd_v07.h @@ -1,5 +1,5 @@  /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.   * All rights reserved.   *   * This source code is licensed under both the BSD-style license (found in the  | 
