Improved index overflow protection

This commit is contained in:
Yann Collet 2016-03-20 16:20:06 +01:00
parent 5244738046
commit ecabfe3777
2 changed files with 22 additions and 13 deletions

View File

@ -289,22 +289,31 @@ size_t ZSTD_copyCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx)
} }
/*! ZSTD_reduceIndex() : /*! ZSTD_reduceTable() :
* rescale indexes to avoid future overflow (indexes are U32) */ * rescale indexes from a table (indexes are U32) */
static void ZSTD_reduceIndex (ZSTD_CCtx* zc, static void ZSTD_reduceTable (U32* const table, U32 const size, U32 const reducerValue)
const U32 reducerValue)
{ {
const U32 contentLog = (zc->params.strategy == ZSTD_fast) ? 1 : zc->params.contentLog; U32 u;
const U32 tableSpaceU32 = (1 << contentLog) + (1 << zc->params.hashLog); for (u=0 ; u < size ; u++) {
U32* table32 = zc->hashTable; if (table[u] < reducerValue) table[u] = 0;
U32 index; else table[u] -= reducerValue;
for (index=0 ; index < tableSpaceU32 ; index++) {
if (table32[index] < reducerValue) table32[index] = 0;
else table32[index] -= 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 * Block entropic compression

View File

@ -143,7 +143,7 @@ roundTripTest -g50000000 -P94 18
roundTripTest -g50000000 -P94 19 roundTripTest -g50000000 -P94 19
roundTripTest -g99000000 -P99 20 roundTripTest -g99000000 -P99 20
roundTripTest -g6000000000 -P99 q roundTripTest -g6000000000 -P99 1
rm tmp* rm tmp*