mirror of
https://github.com/ip7z/7zip.git
synced 2025-12-06 07:12:00 +01:00
fixed memory leak on malformed xz archive parsing
This commit is contained in:
parent
e5431fa6f5
commit
222ead54f4
20
C/XzIn.c
20
C/XzIn.c
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue