fixed memory leak on malformed xz archive parsing

This commit is contained in:
Vitalii Sheludchenkov 2025-03-27 15:07:52 +01:00
parent e5431fa6f5
commit 222ead54f4

View file

@ -117,20 +117,38 @@ static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAllocPt
p->numBlocks = numBlocks;
p->blocks = (CXzBlockSizes *)ISzAlloc_Alloc(alloc, sizeof(CXzBlockSizes) * numBlocks);
if (!p->blocks)
{
Xz_Free(p, alloc);
return SZ_ERROR_MEM;
}
for (i = 0; i < numBlocks; i++)
{
CXzBlockSizes *block = &p->blocks[i];
READ_VARINT_AND_CHECK(buf, pos, size, &block->totalSize)
READ_VARINT_AND_CHECK(buf, pos, size, &block->unpackSize)
if (block->totalSize == 0)
{
Xz_Free(p, alloc);
return SZ_ERROR_ARCHIVE;
}
}
}
while ((pos & 3) != 0)
{
if (buf[pos++] != 0)
{
Xz_Free(p, alloc);
return SZ_ERROR_ARCHIVE;
return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE;
}
}
if (pos != size)
{
Xz_Free(p, alloc);
return SZ_ERROR_ARCHIVE;
}
return SZ_OK;
}
static SRes Xz_ReadIndex(CXzStream *p, ILookInStreamPtr stream, UInt64 indexSize, ISzAllocPtr alloc)