Merge pull request #2779 from senhuang42/fse_fix

Fix NCountWriteBound
dev
sen 2021-09-22 13:51:21 -04:00 committed by GitHub
commit 044c8b4722
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 1 deletions

View File

@ -221,7 +221,11 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct,
****************************************************************/
size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog)
{
size_t const maxHeaderSize = (((maxSymbolValue+1) * tableLog) >> 3) + 3;
size_t const maxHeaderSize = (((maxSymbolValue+1) * tableLog
+ 4 /* bitCount initialized at 4 */
+ 2 /* first two symbols may use one additional bit each */) / 8)
+ 1 /* round up to whole nb bytes */
+ 2 /* additional two bytes for bitstream flush */;
return maxSymbolValue ? maxHeaderSize : FSE_NCOUNTBOUND; /* maxSymbolValue==0 ? use default */
}

View File

@ -3357,6 +3357,23 @@ static int basicUnitTests(U32 const seed, double compressibility)
FSE_normalizeCount(norm, tableLog, count, nbSeq, maxSymbolValue, /* useLowProbCount */ 1);
}
DISPLAYLEVEL(3, "OK \n");
DISPLAYLEVEL(3, "test%3i : testing FSE_writeNCount() PR#2779: ", testNb++);
{
size_t const outBufSize = 9;
short const count[11] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 9, 18};
unsigned const tableLog = 5;
unsigned const maxSymbolValue = 10;
BYTE* outBuf = (BYTE*)malloc(outBufSize*sizeof(BYTE));
/* Ensure that this write doesn't write out of bounds, and that
* FSE_writeNCount_generic() is *not* called with writeIsSafe == 1.
*/
FSE_writeNCount(outBuf, outBufSize, count, maxSymbolValue, tableLog);
free(outBuf);
}
DISPLAYLEVEL(3, "OK \n");
#ifdef ZSTD_MULTITHREAD
DISPLAYLEVEL(3, "test%3i : passing wrong full dict should fail on compressStream2 refPrefix ", testNb++);
{ ZSTD_CCtx* cctx = ZSTD_createCCtx();