Fix wildcopy overwriting data still in window
This commit is contained in:
parent
2252d29a5a
commit
887eaa9e21
@ -2260,7 +2260,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|||||||
|
|
||||||
/* Adapt buffer sizes to frame header instructions */
|
/* Adapt buffer sizes to frame header instructions */
|
||||||
{ size_t const blockSize = MIN(zds->fParams.windowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX);
|
{ size_t const blockSize = MIN(zds->fParams.windowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX);
|
||||||
size_t const neededOutSize = zds->fParams.windowSize + blockSize;
|
size_t const neededOutSize = zds->fParams.windowSize + blockSize + WILDCOPY_OVERLENGTH;
|
||||||
zds->blockSize = blockSize;
|
zds->blockSize = blockSize;
|
||||||
if (zds->inBuffSize < blockSize) {
|
if (zds->inBuffSize < blockSize) {
|
||||||
ZSTD_free(zds->inBuff, zds->customMem);
|
ZSTD_free(zds->inBuff, zds->customMem);
|
||||||
|
@ -4108,7 +4108,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|||||||
zbd->inBuff = (char*)malloc(blockSize);
|
zbd->inBuff = (char*)malloc(blockSize);
|
||||||
if (zbd->inBuff == NULL) return ERROR(memory_allocation);
|
if (zbd->inBuff == NULL) return ERROR(memory_allocation);
|
||||||
}
|
}
|
||||||
{ size_t const neededOutSize = ((size_t)1 << zbd->fParams.windowLog) + blockSize;
|
{ size_t const neededOutSize = ((size_t)1 << zbd->fParams.windowLog) + blockSize + WILDCOPY_OVERLENGTH;
|
||||||
if (zbd->outBuffSize < neededOutSize) {
|
if (zbd->outBuffSize < neededOutSize) {
|
||||||
free(zbd->outBuff);
|
free(zbd->outBuff);
|
||||||
zbd->outBuffSize = neededOutSize;
|
zbd->outBuffSize = neededOutSize;
|
||||||
|
@ -4483,7 +4483,7 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd,
|
|||||||
zbd->inBuff = (char*)zbd->customMem.customAlloc(zbd->customMem.opaque, blockSize);
|
zbd->inBuff = (char*)zbd->customMem.customAlloc(zbd->customMem.opaque, blockSize);
|
||||||
if (zbd->inBuff == NULL) return ERROR(memory_allocation);
|
if (zbd->inBuff == NULL) return ERROR(memory_allocation);
|
||||||
}
|
}
|
||||||
{ size_t const neededOutSize = zbd->fParams.windowSize + blockSize;
|
{ size_t const neededOutSize = zbd->fParams.windowSize + blockSize + WILDCOPY_OVERLENGTH;
|
||||||
if (zbd->outBuffSize < neededOutSize) {
|
if (zbd->outBuffSize < neededOutSize) {
|
||||||
zbd->customMem.customFree(zbd->customMem.opaque, zbd->outBuff);
|
zbd->customMem.customFree(zbd->customMem.opaque, zbd->outBuff);
|
||||||
zbd->outBuffSize = neededOutSize;
|
zbd->outBuffSize = neededOutSize;
|
||||||
|
@ -467,6 +467,30 @@ static int basicUnitTests(U32 seed, double compressibility, ZSTD_customMem custo
|
|||||||
if (ZSTD_findDecompressedSize(compressedBuffer, cSize) != ZSTD_CONTENTSIZE_UNKNOWN) goto _output_error;
|
if (ZSTD_findDecompressedSize(compressedBuffer, cSize) != ZSTD_CONTENTSIZE_UNKNOWN) goto _output_error;
|
||||||
DISPLAYLEVEL(3, "OK \n");
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
|
/* Overlen overwriting window data bug */
|
||||||
|
DISPLAYLEVEL(3, "test%3i : wildcopy doesn't overwrite potential match data : ", testNb++);
|
||||||
|
{ const char* testCase =
|
||||||
|
"\x28\xB5\x2F\xFD\x04\x00\x4C\x00\x00\x10\x61\x61\x01\x00\xFC\x2A"
|
||||||
|
"\xC0\x02\x44\x00\x00\x08\x62\x01\x00\xFC\x2A\x10\x02\x00\x00\x00"
|
||||||
|
"\x4D\x00\x00\x00\x02\x40\x00\x01\x64\xE0\xE6\x19\xC1\xFB\x54\x9E";
|
||||||
|
ZSTD_DStream* zds = ZSTD_createDStream();
|
||||||
|
|
||||||
|
ZSTD_initDStream(zds);
|
||||||
|
inBuff.src = testCase;
|
||||||
|
inBuff.size = 48;
|
||||||
|
inBuff.pos = 0;
|
||||||
|
outBuff.dst = decodedBuffer;
|
||||||
|
outBuff.size = CNBufferSize;
|
||||||
|
outBuff.pos = 0;
|
||||||
|
|
||||||
|
while (inBuff.pos < inBuff.size) {
|
||||||
|
size_t const r = ZSTD_decompressStream(zds, &outBuff, &inBuff);
|
||||||
|
/* Bug will cause checksum to fail */
|
||||||
|
if (ZSTD_isError(r)) goto _output_error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
FUZ_freeDictionary(dictionary);
|
FUZ_freeDictionary(dictionary);
|
||||||
ZSTD_freeCStream(zc);
|
ZSTD_freeCStream(zc);
|
||||||
|
Loading…
Reference in New Issue
Block a user