mirror of
https://github.com/facebook/zstd.git
synced 2025-10-08 00:04:02 -04:00
fix : potential leak (#229)
This commit is contained in:
parent
6c6e1751f6
commit
c093208ab8
@ -1364,17 +1364,19 @@ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, co
|
|||||||
const U32 windowLow = zc->lowLimit;
|
const U32 windowLow = zc->lowLimit;
|
||||||
U32 matchEndIdx = current+8;
|
U32 matchEndIdx = current+8;
|
||||||
size_t bestLength = 8;
|
size_t bestLength = 8;
|
||||||
|
#ifdef ZSTD_C_PREDICT
|
||||||
U32 predictedSmall = *(bt + 2*((current-1)&btMask) + 0);
|
U32 predictedSmall = *(bt + 2*((current-1)&btMask) + 0);
|
||||||
U32 predictedLarge = *(bt + 2*((current-1)&btMask) + 1);
|
U32 predictedLarge = *(bt + 2*((current-1)&btMask) + 1);
|
||||||
predictedSmall += (predictedSmall>0);
|
predictedSmall += (predictedSmall>0);
|
||||||
predictedLarge += (predictedLarge>0);
|
predictedLarge += (predictedLarge>0);
|
||||||
|
#endif /* ZSTD_C_PREDICT */
|
||||||
|
|
||||||
hashTable[h] = current; /* Update Hash Table */
|
hashTable[h] = current; /* Update Hash Table */
|
||||||
|
|
||||||
while (nbCompares-- && (matchIndex > windowLow)) {
|
while (nbCompares-- && (matchIndex > windowLow)) {
|
||||||
U32* nextPtr = bt + 2*(matchIndex & btMask);
|
U32* nextPtr = bt + 2*(matchIndex & btMask);
|
||||||
size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
|
size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
|
||||||
#if 0 /* note : can create issues when hlog small <= 11 */
|
#ifdef ZSTD_C_PREDICT /* note : can create issues when hlog small <= 11 */
|
||||||
const U32* predictPtr = bt + 2*((matchIndex-1) & btMask); /* written this way, as bt is a roll buffer */
|
const U32* predictPtr = bt + 2*((matchIndex-1) & btMask); /* written this way, as bt is a roll buffer */
|
||||||
if (matchIndex == predictedSmall) {
|
if (matchIndex == predictedSmall) {
|
||||||
/* no need to check length, result known */
|
/* no need to check length, result known */
|
||||||
|
@ -114,7 +114,7 @@ FORCE_INLINE U32 ZSTD_getLiteralPrice(seqStore_t* ssPtr, U32 litLength, const BY
|
|||||||
|
|
||||||
/* literals */
|
/* literals */
|
||||||
if (ssPtr->cachedLiterals == literals) {
|
if (ssPtr->cachedLiterals == literals) {
|
||||||
U32 additional = litLength - ssPtr->cachedLitLength;
|
U32 const additional = litLength - ssPtr->cachedLitLength;
|
||||||
const BYTE* literals2 = ssPtr->cachedLiterals + ssPtr->cachedLitLength;
|
const BYTE* literals2 = ssPtr->cachedLiterals + ssPtr->cachedLitLength;
|
||||||
price = ssPtr->cachedPrice + additional * ssPtr->log2litSum;
|
price = ssPtr->cachedPrice + additional * ssPtr->log2litSum;
|
||||||
for (u=0; u < additional; u++)
|
for (u=0; u < additional; u++)
|
||||||
@ -154,7 +154,7 @@ FORCE_INLINE U32 ZSTD_getLiteralPrice(seqStore_t* ssPtr, U32 litLength, const BY
|
|||||||
FORCE_INLINE U32 ZSTD_getPrice(seqStore_t* seqStorePtr, U32 litLength, const BYTE* literals, U32 offset, U32 matchLength)
|
FORCE_INLINE U32 ZSTD_getPrice(seqStore_t* seqStorePtr, U32 litLength, const BYTE* literals, U32 offset, U32 matchLength)
|
||||||
{
|
{
|
||||||
/* offset */
|
/* offset */
|
||||||
BYTE offCode = (BYTE)ZSTD_highbit32(offset+1);
|
BYTE const offCode = (BYTE)ZSTD_highbit32(offset+1);
|
||||||
U32 price = offCode + seqStorePtr->log2offCodeSum - ZSTD_highbit32(seqStorePtr->offCodeFreq[offCode]+1);
|
U32 price = offCode + seqStorePtr->log2offCodeSum - ZSTD_highbit32(seqStorePtr->offCodeFreq[offCode]+1);
|
||||||
|
|
||||||
/* match Length */
|
/* match Length */
|
||||||
@ -200,7 +200,7 @@ MEM_STATIC void ZSTD_updatePrice(seqStore_t* seqStorePtr, U32 litLength, const B
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* match offset */
|
/* match offset */
|
||||||
{ BYTE offCode = (BYTE)ZSTD_highbit32(offset+1);
|
{ BYTE const offCode = (BYTE)ZSTD_highbit32(offset+1);
|
||||||
seqStorePtr->offCodeSum++;
|
seqStorePtr->offCodeSum++;
|
||||||
seqStorePtr->offCodeFreq[offCode]++;
|
seqStorePtr->offCodeFreq[offCode]++;
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbd,
|
|||||||
if (ZSTD_isError(hSize)) return hSize;
|
if (ZSTD_isError(hSize)) return hSize;
|
||||||
if (toLoad > (size_t)(iend-ip)) { /* not enough input to load full header */
|
if (toLoad > (size_t)(iend-ip)) { /* not enough input to load full header */
|
||||||
memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip);
|
memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip);
|
||||||
zbd->lhSize += iend-ip; ip = iend; notDone = 0;
|
zbd->lhSize += iend-ip;
|
||||||
*dstCapacityPtr = 0;
|
*dstCapacityPtr = 0;
|
||||||
return (hSize - zbd->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */
|
return (hSize - zbd->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */
|
||||||
}
|
}
|
||||||
|
@ -826,7 +826,6 @@ static size_t ZDICT_analyzeEntropy(void* dstBuffer, size_t maxDstSize,
|
|||||||
MEM_writeLE32(dstPtr+4, repStartValue[1]);
|
MEM_writeLE32(dstPtr+4, repStartValue[1]);
|
||||||
MEM_writeLE32(dstPtr+8, repStartValue[2]);
|
MEM_writeLE32(dstPtr+8, repStartValue[2]);
|
||||||
#endif
|
#endif
|
||||||
dstPtr += 12;
|
|
||||||
eSize += 12;
|
eSize += 12;
|
||||||
|
|
||||||
_cleanup:
|
_cleanup:
|
||||||
@ -906,6 +905,7 @@ size_t ZDICT_addEntropyTablesFromBuffer_advanced(void* dictBuffer, size_t dictCo
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define DIB_MINSAMPLESSIZE (DIB_FASTSEGMENTSIZE*3)
|
#define DIB_MINSAMPLESSIZE (DIB_FASTSEGMENTSIZE*3)
|
||||||
|
#define EXIT(e) { dictSize = ERROR(e); goto _cleanup; }
|
||||||
/*! ZDICT_trainFromBuffer_unsafe() :
|
/*! ZDICT_trainFromBuffer_unsafe() :
|
||||||
* `samplesBuffer` must be followed by noisy guard band.
|
* `samplesBuffer` must be followed by noisy guard band.
|
||||||
* @return : size of dictionary.
|
* @return : size of dictionary.
|
||||||
@ -923,12 +923,12 @@ size_t ZDICT_trainFromBuffer_unsafe(
|
|||||||
size_t dictSize = 0;
|
size_t dictSize = 0;
|
||||||
|
|
||||||
/* checks */
|
/* checks */
|
||||||
if (maxDictSize <= g_provision_entropySize + g_min_fast_dictContent) return ERROR(dstSize_tooSmall);
|
if (maxDictSize <= g_provision_entropySize + g_min_fast_dictContent) EXIT(dstSize_tooSmall);
|
||||||
if (!dictList) return ERROR(memory_allocation);
|
if (!dictList) return ERROR(memory_allocation);
|
||||||
|
|
||||||
/* init */
|
/* init */
|
||||||
{ unsigned u; for (u=0, sBuffSize=0; u<nbSamples; u++) sBuffSize += samplesSizes[u]; }
|
{ unsigned u; for (u=0, sBuffSize=0; u<nbSamples; u++) sBuffSize += samplesSizes[u]; }
|
||||||
if (sBuffSize < DIB_MINSAMPLESSIZE) return 0; /* not enough source to create dictionary */
|
if (sBuffSize < DIB_MINSAMPLESSIZE) EXIT(no_error); /* not enough source to create dictionary */
|
||||||
ZDICT_initDictItem(dictList);
|
ZDICT_initDictItem(dictList);
|
||||||
g_displayLevel = params.notificationLevel;
|
g_displayLevel = params.notificationLevel;
|
||||||
if (selectivity==0) selectivity = g_selectivity_default;
|
if (selectivity==0) selectivity = g_selectivity_default;
|
||||||
@ -948,9 +948,9 @@ size_t ZDICT_trainFromBuffer_unsafe(
|
|||||||
DISPLAYLEVEL(3, "\n %u segments found, of total size %u \n", dictList[0].pos, dictContentSize);
|
DISPLAYLEVEL(3, "\n %u segments found, of total size %u \n", dictList[0].pos, dictContentSize);
|
||||||
DISPLAYLEVEL(3, "list %u best segments \n", nb);
|
DISPLAYLEVEL(3, "list %u best segments \n", nb);
|
||||||
for (u=1; u<=nb; u++) {
|
for (u=1; u<=nb; u++) {
|
||||||
U32 p = dictList[u].pos;
|
U32 const p = dictList[u].pos;
|
||||||
U32 l = dictList[u].length;
|
U32 const l = dictList[u].length;
|
||||||
U32 d = MIN(40, l);
|
U32 const d = MIN(40, l);
|
||||||
DISPLAYLEVEL(3, "%3u:%3u bytes at pos %8u, savings %7u bytes |",
|
DISPLAYLEVEL(3, "%3u:%3u bytes at pos %8u, savings %7u bytes |",
|
||||||
u, l, p, dictList[u].savings);
|
u, l, p, dictList[u].savings);
|
||||||
ZDICT_printHex(3, (const char*)samplesBuffer+p, d);
|
ZDICT_printHex(3, (const char*)samplesBuffer+p, d);
|
||||||
@ -966,7 +966,7 @@ size_t ZDICT_trainFromBuffer_unsafe(
|
|||||||
for (u=1; u<dictList->pos; u++) {
|
for (u=1; u<dictList->pos; u++) {
|
||||||
U32 l = dictList[u].length;
|
U32 l = dictList[u].length;
|
||||||
ptr -= l;
|
ptr -= l;
|
||||||
if (ptr<(BYTE*)dictBuffer) return ERROR(GENERIC); /* should not happen */
|
if (ptr<(BYTE*)dictBuffer) EXIT(GENERIC); /* should not happen */
|
||||||
memcpy(ptr, (const char*)samplesBuffer+dictList[u].pos, l);
|
memcpy(ptr, (const char*)samplesBuffer+dictList[u].pos, l);
|
||||||
} }
|
} }
|
||||||
|
|
||||||
@ -983,7 +983,7 @@ size_t ZDICT_trainFromBuffer_unsafe(
|
|||||||
params);
|
params);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clean up */
|
_cleanup :
|
||||||
free(dictList);
|
free(dictList);
|
||||||
return dictSize;
|
return dictSize;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user