From: Yann Collet Date: Sun, 20 Mar 2016 15:20:06 +0000 (+0100) Subject: Improved index overflow protection X-Git-Tag: v0.6.0^2~17^2~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ecabfe3777a08e007ed6c5cb660f6174dc75c783;p=thirdparty%2Fzstd.git Improved index overflow protection --- diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index a699f3e43..cfb2519ad 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -289,22 +289,31 @@ size_t ZSTD_copyCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx) } -/*! ZSTD_reduceIndex() : -* rescale indexes to avoid future overflow (indexes are U32) */ -static void ZSTD_reduceIndex (ZSTD_CCtx* zc, - const U32 reducerValue) -{ - const U32 contentLog = (zc->params.strategy == ZSTD_fast) ? 1 : zc->params.contentLog; - const U32 tableSpaceU32 = (1 << contentLog) + (1 << zc->params.hashLog); - U32* table32 = zc->hashTable; - U32 index; - - for (index=0 ; index < tableSpaceU32 ; index++) { - if (table32[index] < reducerValue) table32[index] = 0; - else table32[index] -= reducerValue; +/*! ZSTD_reduceTable() : +* rescale indexes from a table (indexes are U32) */ +static void ZSTD_reduceTable (U32* const table, U32 const size, U32 const reducerValue) +{ + U32 u; + for (u=0 ; u < size ; u++) { + if (table[u] < reducerValue) table[u] = 0; + else table[u] -= reducerValue; } } +/*! ZSTD_reduceIndex() : +* rescale all indexes to avoid future overflow (indexes are U32) */ +static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue) +{ + { const U32 hSize = 1 << zc->params.hashLog; + ZSTD_reduceTable(zc->hashTable, hSize, reducerValue); } + + { const U32 contentSize = (zc->params.strategy == ZSTD_fast) ? 0 : (1 << zc->params.contentLog); + ZSTD_reduceTable(zc->contentTable, contentSize, reducerValue); } + + { const U32 h3Size = (zc->params.searchLength == 3) ? (1 << HASHLOG3) : 0; + ZSTD_reduceTable(zc->hashTable3, h3Size, reducerValue); } +} + /*-******************************************************* * Block entropic compression diff --git a/programs/playTests.sh b/programs/playTests.sh index 891ab9d4e..444d91ebe 100755 --- a/programs/playTests.sh +++ b/programs/playTests.sh @@ -143,7 +143,7 @@ roundTripTest -g50000000 -P94 18 roundTripTest -g50000000 -P94 19 roundTripTest -g99000000 -P99 20 -roundTripTest -g6000000000 -P99 q +roundTripTest -g6000000000 -P99 1 rm tmp*