Example #1
0
SRes Xz_AddIndexRecord(CXzStream *p, UInt64 unpackSize, UInt64 totalSize, ISzAlloc *alloc)
{
	if (p->blocks == 0 || p->numBlocksAllocated == p->numBlocks)
	{
	size_t num = (p->numBlocks + 1) * 2;
	size_t newSize = sizeof(CXzBlockSizes) * num;
	CXzBlockSizes *blocks;
	if (newSize / sizeof(CXzBlockSizes) != num)
		return SZ_ERROR_MEM;
	blocks = alloc->Alloc(alloc, newSize);
	if (blocks == 0)
		return SZ_ERROR_MEM;
	if (p->numBlocks != 0)
	{
		memcpy(blocks, p->blocks, p->numBlocks * sizeof(CXzBlockSizes));
		Xz_Free(p, alloc);
	}
	p->blocks = blocks;
	p->numBlocksAllocated = num;
	}
	{
	CXzBlockSizes *block = &p->blocks[p->numBlocks++];
	block->totalSize = totalSize;
	block->unpackSize = unpackSize;
	}
	return SZ_OK;
}
Example #2
0
File: XzIn.c Project: 0xe7/hashcat
void Xzs_Free(CXzs *p, ISzAllocPtr alloc)
{
  size_t i;
  for (i = 0; i < p->num; i++)
    Xz_Free(&p->streams[i], alloc);
  ISzAlloc_Free(alloc, p->streams);
  p->num = p->numAllocated = 0;
  p->streams = 0;
}
Example #3
0
SRes Xz_EncodeEmpty(ISeqOutStream *outStream)
{
	SRes res;
	CXzStream xz;
	Xz_Construct(&xz);
	res = Xz_WriteHeader(xz.flags, outStream);
	if (res == SZ_OK)
	res = Xz_WriteFooter(&xz, outStream);
	Xz_Free(&xz, &g_Alloc);
	return res;
}
Example #4
0
SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream,
	const CXzProps *props, ICompressProgress *progress)
{
	SRes res;
	CXzStream xz;
	CLzma2WithFilters lzmaf;
	Xz_Construct(&xz);
	Lzma2WithFilters_Construct(&lzmaf, &g_Alloc, &g_BigAlloc);
	res = Lzma2WithFilters_Create(&lzmaf);
	if (res == SZ_OK)
	res = Xz_Compress(&xz, &lzmaf, outStream, inStream, props, progress);
	Lzma2WithFilters_Free(&lzmaf);
	Xz_Free(&xz, &g_Alloc);
	return res;
}
Example #5
0
static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAlloc *alloc)
{
  size_t i, numBlocks, crcStartPos, pos = 1;
  UInt32 crc;

  if (size < 5 || buf[0] != 0)
    return SZ_ERROR_ARCHIVE;

  size -= 4;
  crc = CrcCalc(buf, size);
  if (crc != GetUi32(buf + size))
    return SZ_ERROR_ARCHIVE;

  {
    UInt64 numBlocks64;
    READ_VARINT_AND_CHECK(buf, pos, size, &numBlocks64);
    numBlocks = (size_t)numBlocks64;
    if (numBlocks != numBlocks64 || numBlocks * 2 > size)
      return SZ_ERROR_ARCHIVE;
  }

  crcStartPos = pos;
  Xz_Free(p, alloc);
  if (numBlocks != 0)
  {
    p->numBlocks = numBlocks;
    p->numBlocksAllocated = numBlocks;
    p->blocks = alloc->Alloc(alloc, sizeof(CXzBlockSizes) * numBlocks);
    if (p->blocks == 0)
      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)
        return SZ_ERROR_ARCHIVE;
    }
  }
  while ((pos & 3) != 0)
    if (buf[pos++] != 0)
      return SZ_ERROR_ARCHIVE;
  return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE;
}