@@ -111,6 +111,18 @@ HUF_PUBLIC_API size_t HUF_compress2 (void* dst, size_t dstCapacity, const void*
111111#define HUF_WORKSPACE_SIZE_U32 (HUF_WORKSPACE_SIZE / sizeof(U32))
112112HUF_PUBLIC_API size_t HUF_compress4X_wksp (void * dst , size_t dstCapacity , const void * src , size_t srcSize , unsigned maxSymbolValue , unsigned tableLog , void * workSpace , size_t wkspSize );
113113
114+ /**
115+ * The minimum workspace size for the `workSpace` used in
116+ * HUF_readDTableX2_wksp() and HUF_readDTableX4_wksp().
117+ *
118+ * The space used depends on HUF_TABLELOG_MAX, ranging from ~1500 bytes when
119+ * HUF_TABLE_LOG_MAX=12 to ~1850 bytes when HUF_TABLE_LOG_MAX=15.
120+ * Buffer overflow errors may potentially occur if code modifications result in
121+ * a required workspace size greater than that specified in the following
122+ * macro.
123+ */
124+ #define HUF_DECOMPRESS_WORKSPACE_SIZE (2 << 10)
125+ #define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32))
114126
115127
116128/* ******************************************************************
@@ -170,8 +182,11 @@ size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cS
170182
171183size_t HUF_decompress4X_DCtx (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize ); /**< decodes RLE and uncompressed */
172184size_t HUF_decompress4X_hufOnly (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize ); /**< considers RLE and uncompressed as errors */
185+ size_t HUF_decompress4X_hufOnly_wksp (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize , void * workSpace , size_t wkspSize ); /**< considers RLE and uncompressed as errors */
173186size_t HUF_decompress4X2_DCtx (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize ); /**< single-symbol decoder */
187+ size_t HUF_decompress4X2_DCtx_wksp (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize , void * workSpace , size_t wkspSize ); /**< single-symbol decoder */
174188size_t HUF_decompress4X4_DCtx (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize ); /**< double-symbols decoder */
189+ size_t HUF_decompress4X4_DCtx_wksp (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize , void * workSpace , size_t wkspSize ); /**< double-symbols decoder */
175190
176191
177192/* ****************************************
@@ -243,7 +258,9 @@ HUF_decompress() does the following:
243258U32 HUF_selectDecoder (size_t dstSize , size_t cSrcSize );
244259
245260size_t HUF_readDTableX2 (HUF_DTable * DTable , const void * src , size_t srcSize );
261+ size_t HUF_readDTableX2_wksp (HUF_DTable * DTable , const void * src , size_t srcSize , void * workSpace , size_t wkspSize );
246262size_t HUF_readDTableX4 (HUF_DTable * DTable , const void * src , size_t srcSize );
263+ size_t HUF_readDTableX4_wksp (HUF_DTable * DTable , const void * src , size_t srcSize , void * workSpace , size_t wkspSize );
247264
248265size_t HUF_decompress4X_usingDTable (void * dst , size_t maxDstSize , const void * cSrc , size_t cSrcSize , const HUF_DTable * DTable );
249266size_t HUF_decompress4X2_usingDTable (void * dst , size_t maxDstSize , const void * cSrc , size_t cSrcSize , const HUF_DTable * DTable );
@@ -266,8 +283,11 @@ size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cS
266283size_t HUF_decompress1X4 (void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize ); /* double-symbol decoder */
267284
268285size_t HUF_decompress1X_DCtx (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize );
286+ size_t HUF_decompress1X_DCtx_wksp (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize , void * workSpace , size_t wkspSize );
269287size_t HUF_decompress1X2_DCtx (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize ); /**< single-symbol decoder */
288+ size_t HUF_decompress1X2_DCtx_wksp (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize , void * workSpace , size_t wkspSize ); /**< single-symbol decoder */
270289size_t HUF_decompress1X4_DCtx (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize ); /**< double-symbols decoder */
290+ size_t HUF_decompress1X4_DCtx_wksp (HUF_DTable * dctx , void * dst , size_t dstSize , const void * cSrc , size_t cSrcSize , void * workSpace , size_t wkspSize ); /**< double-symbols decoder */
271291
272292size_t HUF_decompress1X_usingDTable (void * dst , size_t maxDstSize , const void * cSrc , size_t cSrcSize , const HUF_DTable * DTable ); /**< automatic selection of sing or double symbol decoder, based on DTable */
273293size_t HUF_decompress1X2_usingDTable (void * dst , size_t maxDstSize , const void * cSrc , size_t cSrcSize , const HUF_DTable * DTable );
0 commit comments