]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
[superblock] Reduce stack usage by correctly sizing header buffers 2326/head
authorNick Terrell <terrelln@fb.com>
Fri, 25 Sep 2020 01:04:44 +0000 (18:04 -0700)
committerNick Terrell <terrelln@fb.com>
Fri, 25 Sep 2020 02:42:04 +0000 (19:42 -0700)
lib/common/zstd_internal.h
lib/compress/zstd_compress_superblock.c

index 79887c9edb03690ba5474cd0eb1989a9d77890b5..f57f8f83f575c1fd96594abc368a8457925257da 100644 (file)
@@ -186,6 +186,10 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy
 #define OffFSELog   8
 #define MaxFSELog  MAX(MAX(MLFSELog, LLFSELog), OffFSELog)
 
+#define ZSTD_MAX_HUF_HEADER_SIZE 128 /* header + <= 127 byte tree description */
+/* Each table cannot take more than #symbols * FSELog bits */
+#define ZSTD_MAX_FSE_HEADERS_SIZE (((MaxML + 1) * MLFSELog + (MaxLL + 1) * LLFSELog + (MaxOff + 1) * OffFSELog + 7) / 8)
+
 static UNUSED_ATTR const U32 LL_bits[MaxLL+1] = {
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
index 144c120d2c97749d0f01cba75bbbfd7b260359ce..e23e619eef1407d8aabbd41a7610baa5566af3b5 100644 (file)
@@ -29,7 +29,7 @@
  *  This metadata is populated in ZSTD_buildSuperBlockEntropy_literal() */
 typedef struct {
     symbolEncodingType_e hType;
-    BYTE hufDesBuffer[500]; /* TODO give name to this value */
+    BYTE hufDesBuffer[ZSTD_MAX_HUF_HEADER_SIZE];
     size_t hufDesSize;
 } ZSTD_hufCTablesMetadata_t;
 
@@ -42,7 +42,7 @@ typedef struct {
     symbolEncodingType_e llType;
     symbolEncodingType_e ofType;
     symbolEncodingType_e mlType;
-    BYTE fseTablesBuffer[500]; /* TODO give name to this value */
+    BYTE fseTablesBuffer[ZSTD_MAX_FSE_HEADERS_SIZE];
     size_t fseTablesSize;
     size_t lastCountSize; /* This is to account for bug in 1.3.4. More detail in ZSTD_compressSubBlock_sequences() */
 } ZSTD_fseCTablesMetadata_t;