| Index: third_party/lzma_sdk/7zDec.c
|
| diff --git a/third_party/lzma_sdk/7zDec.c b/third_party/lzma_sdk/7zDec.c
|
| index b6d809956cd2b77dadf8e8b1d3d99816dc7106ff..c45d6bf8d4bfb15957819d936cc4596854cadef3 100644
|
| --- a/third_party/lzma_sdk/7zDec.c
|
| +++ b/third_party/lzma_sdk/7zDec.c
|
| @@ -1,15 +1,19 @@
|
| /* 7zDec.c -- Decoding from 7z folder
|
| -2010-11-02 : Igor Pavlov : Public domain */
|
| +2015-11-18 : Igor Pavlov : Public domain */
|
| +
|
| +#include "Precomp.h"
|
|
|
| #include <string.h>
|
|
|
| /* #define _7ZIP_PPMD_SUPPPORT */
|
|
|
| #include "7z.h"
|
| +#include "7zCrc.h"
|
|
|
| #include "Bcj2.h"
|
| #include "Bra.h"
|
| #include "CpuArch.h"
|
| +#include "Delta.h"
|
| #include "LzmaDec.h"
|
| #include "Lzma2Dec.h"
|
| #ifdef _7ZIP_PPMD_SUPPPORT
|
| @@ -17,14 +21,17 @@
|
| #endif
|
|
|
| #define k_Copy 0
|
| +#define k_Delta 3
|
| #define k_LZMA2 0x21
|
| #define k_LZMA 0x30101
|
| -#define k_BCJ 0x03030103
|
| -#define k_PPC 0x03030205
|
| -#define k_ARM 0x03030501
|
| -#define k_ARMT 0x03030701
|
| -#define k_SPARC 0x03030805
|
| -#define k_BCJ2 0x0303011B
|
| +#define k_BCJ 0x3030103
|
| +#define k_BCJ2 0x303011B
|
| +#define k_PPC 0x3030205
|
| +#define k_IA64 0x3030401
|
| +#define k_ARM 0x3030501
|
| +#define k_ARMT 0x3030701
|
| +#define k_SPARC 0x3030805
|
| +
|
|
|
| #ifdef _7ZIP_PPMD_SUPPPORT
|
|
|
| @@ -63,7 +70,7 @@ static Byte ReadByte(void *pp)
|
| return 0;
|
| }
|
|
|
| -static SRes SzDecodePpmd(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inStream,
|
| +static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream,
|
| Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain)
|
| {
|
| CPpmd7 ppmd;
|
| @@ -77,12 +84,12 @@ static SRes SzDecodePpmd(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inSt
|
| s.res = SZ_OK;
|
| s.processed = 0;
|
|
|
| - if (coder->Props.size != 5)
|
| + if (propsSize != 5)
|
| return SZ_ERROR_UNSUPPORTED;
|
|
|
| {
|
| - unsigned order = coder->Props.data[0];
|
| - UInt32 memSize = GetUi32(coder->Props.data + 1);
|
| + unsigned order = props[0];
|
| + UInt32 memSize = GetUi32(props + 1);
|
| if (order < PPMD7_MIN_ORDER ||
|
| order > PPMD7_MAX_ORDER ||
|
| memSize < PPMD7_MIN_MEM_SIZE ||
|
| @@ -124,25 +131,25 @@ static SRes SzDecodePpmd(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inSt
|
| #endif
|
|
|
|
|
| -static SRes SzDecodeLzma(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inStream,
|
| +static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream,
|
| Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain)
|
| {
|
| CLzmaDec state;
|
| SRes res = SZ_OK;
|
|
|
| LzmaDec_Construct(&state);
|
| - RINOK(LzmaDec_AllocateProbs(&state, coder->Props.data, (unsigned)coder->Props.size, allocMain));
|
| + RINOK(LzmaDec_AllocateProbs(&state, props, propsSize, allocMain));
|
| state.dic = outBuffer;
|
| state.dicBufSize = outSize;
|
| LzmaDec_Init(&state);
|
|
|
| for (;;)
|
| {
|
| - Byte *inBuf = NULL;
|
| + const void *inBuf = NULL;
|
| size_t lookahead = (1 << 18);
|
| if (lookahead > inSize)
|
| lookahead = (size_t)inSize;
|
| - res = inStream->Look((void *)inStream, (const void **)&inBuf, &lookahead);
|
| + res = inStream->Look(inStream, &inBuf, &lookahead);
|
| if (res != SZ_OK)
|
| break;
|
|
|
| @@ -154,14 +161,23 @@ static SRes SzDecodeLzma(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inSt
|
| inSize -= inProcessed;
|
| if (res != SZ_OK)
|
| break;
|
| - if (state.dicPos == state.dicBufSize || (inProcessed == 0 && dicPos == state.dicPos))
|
| +
|
| + if (status == LZMA_STATUS_FINISHED_WITH_MARK)
|
| {
|
| - if (state.dicBufSize != outSize || lookahead != 0 ||
|
| - (status != LZMA_STATUS_FINISHED_WITH_MARK &&
|
| - status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK))
|
| + if (outSize != state.dicPos || inSize != 0)
|
| res = SZ_ERROR_DATA;
|
| break;
|
| }
|
| +
|
| + if (outSize == state.dicPos && inSize == 0 && status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)
|
| + break;
|
| +
|
| + if (inProcessed == 0 && dicPos == state.dicPos)
|
| + {
|
| + res = SZ_ERROR_DATA;
|
| + break;
|
| + }
|
| +
|
| res = inStream->Skip((void *)inStream, inProcessed);
|
| if (res != SZ_OK)
|
| break;
|
| @@ -172,27 +188,30 @@ static SRes SzDecodeLzma(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inSt
|
| return res;
|
| }
|
|
|
| -static SRes SzDecodeLzma2(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inStream,
|
| +
|
| +#ifndef _7Z_NO_METHOD_LZMA2
|
| +
|
| +static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream,
|
| Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain)
|
| {
|
| CLzma2Dec state;
|
| SRes res = SZ_OK;
|
|
|
| Lzma2Dec_Construct(&state);
|
| - if (coder->Props.size != 1)
|
| + if (propsSize != 1)
|
| return SZ_ERROR_DATA;
|
| - RINOK(Lzma2Dec_AllocateProbs(&state, coder->Props.data[0], allocMain));
|
| + RINOK(Lzma2Dec_AllocateProbs(&state, props[0], allocMain));
|
| state.decoder.dic = outBuffer;
|
| state.decoder.dicBufSize = outSize;
|
| Lzma2Dec_Init(&state);
|
|
|
| for (;;)
|
| {
|
| - Byte *inBuf = NULL;
|
| + const void *inBuf = NULL;
|
| size_t lookahead = (1 << 18);
|
| if (lookahead > inSize)
|
| lookahead = (size_t)inSize;
|
| - res = inStream->Look((void *)inStream, (const void **)&inBuf, &lookahead);
|
| + res = inStream->Look(inStream, &inBuf, &lookahead);
|
| if (res != SZ_OK)
|
| break;
|
|
|
| @@ -204,13 +223,20 @@ static SRes SzDecodeLzma2(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inS
|
| inSize -= inProcessed;
|
| if (res != SZ_OK)
|
| break;
|
| - if (state.decoder.dicPos == state.decoder.dicBufSize || (inProcessed == 0 && dicPos == state.decoder.dicPos))
|
| +
|
| + if (status == LZMA_STATUS_FINISHED_WITH_MARK)
|
| {
|
| - if (state.decoder.dicBufSize != outSize || lookahead != 0 ||
|
| - (status != LZMA_STATUS_FINISHED_WITH_MARK))
|
| + if (outSize != state.decoder.dicPos || inSize != 0)
|
| res = SZ_ERROR_DATA;
|
| break;
|
| }
|
| +
|
| + if (inProcessed == 0 && dicPos == state.decoder.dicPos)
|
| + {
|
| + res = SZ_ERROR_DATA;
|
| + break;
|
| + }
|
| +
|
| res = inStream->Skip((void *)inStream, inProcessed);
|
| if (res != SZ_OK)
|
| break;
|
| @@ -221,15 +247,18 @@ static SRes SzDecodeLzma2(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inS
|
| return res;
|
| }
|
|
|
| +#endif
|
| +
|
| +
|
| static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer)
|
| {
|
| while (inSize > 0)
|
| {
|
| - void *inBuf;
|
| + const void *inBuf;
|
| size_t curSize = (1 << 18);
|
| if (curSize > inSize)
|
| curSize = (size_t)inSize;
|
| - RINOK(inStream->Look((void *)inStream, (const void **)&inBuf, &curSize));
|
| + RINOK(inStream->Look(inStream, &inBuf, &curSize));
|
| if (curSize == 0)
|
| return SZ_ERROR_INPUT_EOF;
|
| memcpy(outBuffer, inBuf, curSize);
|
| @@ -242,11 +271,13 @@ static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer
|
|
|
| static Bool IS_MAIN_METHOD(UInt32 m)
|
| {
|
| - switch(m)
|
| + switch (m)
|
| {
|
| case k_Copy:
|
| case k_LZMA:
|
| + #ifndef _7Z_NO_METHOD_LZMA2
|
| case k_LZMA2:
|
| + #endif
|
| #ifdef _7ZIP_PPMD_SUPPPORT
|
| case k_PPMD:
|
| #endif
|
| @@ -258,13 +289,12 @@ static Bool IS_MAIN_METHOD(UInt32 m)
|
| static Bool IS_SUPPORTED_CODER(const CSzCoderInfo *c)
|
| {
|
| return
|
| - c->NumInStreams == 1 &&
|
| - c->NumOutStreams == 1 &&
|
| - c->MethodID <= (UInt32)0xFFFFFFFF &&
|
| - IS_MAIN_METHOD((UInt32)c->MethodID);
|
| + c->NumStreams == 1
|
| + /* && c->MethodID <= (UInt32)0xFFFFFFFF */
|
| + && IS_MAIN_METHOD((UInt32)c->MethodID);
|
| }
|
|
|
| -#define IS_BCJ2(c) ((c)->MethodID == k_BCJ2 && (c)->NumInStreams == 4 && (c)->NumOutStreams == 1)
|
| +#define IS_BCJ2(c) ((c)->MethodID == k_BCJ2 && (c)->NumStreams == 4)
|
|
|
| static SRes CheckSupportedFolder(const CSzFolder *f)
|
| {
|
| @@ -274,65 +304,73 @@ static SRes CheckSupportedFolder(const CSzFolder *f)
|
| return SZ_ERROR_UNSUPPORTED;
|
| if (f->NumCoders == 1)
|
| {
|
| - if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBindPairs != 0)
|
| + if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBonds != 0)
|
| return SZ_ERROR_UNSUPPORTED;
|
| return SZ_OK;
|
| }
|
| +
|
| +
|
| + #ifndef _7Z_NO_METHODS_FILTERS
|
| +
|
| if (f->NumCoders == 2)
|
| {
|
| - CSzCoderInfo *c = &f->Coders[1];
|
| - if (c->MethodID > (UInt32)0xFFFFFFFF ||
|
| - c->NumInStreams != 1 ||
|
| - c->NumOutStreams != 1 ||
|
| - f->NumPackStreams != 1 ||
|
| - f->PackStreams[0] != 0 ||
|
| - f->NumBindPairs != 1 ||
|
| - f->BindPairs[0].InIndex != 1 ||
|
| - f->BindPairs[0].OutIndex != 0)
|
| + const CSzCoderInfo *c = &f->Coders[1];
|
| + if (
|
| + /* c->MethodID > (UInt32)0xFFFFFFFF || */
|
| + c->NumStreams != 1
|
| + || f->NumPackStreams != 1
|
| + || f->PackStreams[0] != 0
|
| + || f->NumBonds != 1
|
| + || f->Bonds[0].InIndex != 1
|
| + || f->Bonds[0].OutIndex != 0)
|
| return SZ_ERROR_UNSUPPORTED;
|
| switch ((UInt32)c->MethodID)
|
| {
|
| + case k_Delta:
|
| case k_BCJ:
|
| + case k_PPC:
|
| + case k_IA64:
|
| + case k_SPARC:
|
| case k_ARM:
|
| + case k_ARMT:
|
| break;
|
| default:
|
| return SZ_ERROR_UNSUPPORTED;
|
| }
|
| return SZ_OK;
|
| }
|
| +
|
| + #endif
|
| +
|
| +
|
| if (f->NumCoders == 4)
|
| {
|
| - if (!IS_SUPPORTED_CODER(&f->Coders[1]) ||
|
| - !IS_SUPPORTED_CODER(&f->Coders[2]) ||
|
| - !IS_BCJ2(&f->Coders[3]))
|
| + if (!IS_SUPPORTED_CODER(&f->Coders[1])
|
| + || !IS_SUPPORTED_CODER(&f->Coders[2])
|
| + || !IS_BCJ2(&f->Coders[3]))
|
| return SZ_ERROR_UNSUPPORTED;
|
| - if (f->NumPackStreams != 4 ||
|
| - f->PackStreams[0] != 2 ||
|
| - f->PackStreams[1] != 6 ||
|
| - f->PackStreams[2] != 1 ||
|
| - f->PackStreams[3] != 0 ||
|
| - f->NumBindPairs != 3 ||
|
| - f->BindPairs[0].InIndex != 5 || f->BindPairs[0].OutIndex != 0 ||
|
| - f->BindPairs[1].InIndex != 4 || f->BindPairs[1].OutIndex != 1 ||
|
| - f->BindPairs[2].InIndex != 3 || f->BindPairs[2].OutIndex != 2)
|
| + if (f->NumPackStreams != 4
|
| + || f->PackStreams[0] != 2
|
| + || f->PackStreams[1] != 6
|
| + || f->PackStreams[2] != 1
|
| + || f->PackStreams[3] != 0
|
| + || f->NumBonds != 3
|
| + || f->Bonds[0].InIndex != 5 || f->Bonds[0].OutIndex != 0
|
| + || f->Bonds[1].InIndex != 4 || f->Bonds[1].OutIndex != 1
|
| + || f->Bonds[2].InIndex != 3 || f->Bonds[2].OutIndex != 2)
|
| return SZ_ERROR_UNSUPPORTED;
|
| return SZ_OK;
|
| }
|
| +
|
| return SZ_ERROR_UNSUPPORTED;
|
| }
|
|
|
| -static UInt64 GetSum(const UInt64 *values, UInt32 index)
|
| -{
|
| - UInt64 sum = 0;
|
| - UInt32 i;
|
| - for (i = 0; i < index; i++)
|
| - sum += values[i];
|
| - return sum;
|
| -}
|
| -
|
| #define CASE_BRA_CONV(isa) case k_ ## isa: isa ## _Convert(outBuffer, outSize, 0, 0); break;
|
|
|
| -static SRes SzFolder_Decode2(const CSzFolder *folder, const UInt64 *packSizes,
|
| +static SRes SzFolder_Decode2(const CSzFolder *folder,
|
| + const Byte *propsData,
|
| + const UInt64 *unpackSizes,
|
| + const UInt64 *packPositions,
|
| ILookInStream *inStream, UInt64 startPos,
|
| Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain,
|
| Byte *tempBuf[])
|
| @@ -346,7 +384,7 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, const UInt64 *packSizes,
|
|
|
| for (ci = 0; ci < folder->NumCoders; ci++)
|
| {
|
| - CSzCoderInfo *coder = &folder->Coders[ci];
|
| + const CSzCoderInfo *coder = &folder->Coders[ci];
|
|
|
| if (IS_MAIN_METHOD((UInt32)coder->MethodID))
|
| {
|
| @@ -358,7 +396,7 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, const UInt64 *packSizes,
|
| if (folder->NumCoders == 4)
|
| {
|
| UInt32 indices[] = { 3, 2, 0 };
|
| - UInt64 unpackSize = folder->UnpackSizes[ci];
|
| + UInt64 unpackSize = unpackSizes[ci];
|
| si = indices[ci];
|
| if (ci < 2)
|
| {
|
| @@ -367,7 +405,7 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, const UInt64 *packSizes,
|
| if (outSizeCur != unpackSize)
|
| return SZ_ERROR_MEM;
|
| temp = (Byte *)IAlloc_Alloc(allocMain, outSizeCur);
|
| - if (temp == 0 && outSizeCur != 0)
|
| + if (!temp && outSizeCur != 0)
|
| return SZ_ERROR_MEM;
|
| outBufCur = tempBuf[1 - ci] = temp;
|
| tempSizes[1 - ci] = outSizeCur;
|
| @@ -382,8 +420,8 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, const UInt64 *packSizes,
|
| else
|
| return SZ_ERROR_UNSUPPORTED;
|
| }
|
| - offset = GetSum(packSizes, si);
|
| - inSize = packSizes[si];
|
| + offset = packPositions[si];
|
| + inSize = packPositions[si + 1] - offset;
|
| RINOK(LookInStream_SeekTo(inStream, startPos + offset));
|
|
|
| if (coder->MethodID == k_Copy)
|
| @@ -394,77 +432,160 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, const UInt64 *packSizes,
|
| }
|
| else if (coder->MethodID == k_LZMA)
|
| {
|
| - RINOK(SzDecodeLzma(coder, inSize, inStream, outBufCur, outSizeCur, allocMain));
|
| + RINOK(SzDecodeLzma(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain));
|
| }
|
| + #ifndef _7Z_NO_METHOD_LZMA2
|
| else if (coder->MethodID == k_LZMA2)
|
| {
|
| - RINOK(SzDecodeLzma2(coder, inSize, inStream, outBufCur, outSizeCur, allocMain));
|
| + RINOK(SzDecodeLzma2(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain));
|
| }
|
| - else
|
| + #endif
|
| + #ifdef _7ZIP_PPMD_SUPPPORT
|
| + else if (coder->MethodID == k_PPMD)
|
| {
|
| - #ifdef _7ZIP_PPMD_SUPPPORT
|
| - RINOK(SzDecodePpmd(coder, inSize, inStream, outBufCur, outSizeCur, allocMain));
|
| - #else
|
| - return SZ_ERROR_UNSUPPORTED;
|
| - #endif
|
| + RINOK(SzDecodePpmd(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain));
|
| }
|
| + #endif
|
| + else
|
| + return SZ_ERROR_UNSUPPORTED;
|
| }
|
| else if (coder->MethodID == k_BCJ2)
|
| {
|
| - UInt64 offset = GetSum(packSizes, 1);
|
| - UInt64 s3Size = packSizes[1];
|
| - SRes res;
|
| + UInt64 offset = packPositions[1];
|
| + UInt64 s3Size = packPositions[2] - offset;
|
| +
|
| if (ci != 3)
|
| return SZ_ERROR_UNSUPPORTED;
|
| - RINOK(LookInStream_SeekTo(inStream, startPos + offset));
|
| +
|
| tempSizes[2] = (SizeT)s3Size;
|
| if (tempSizes[2] != s3Size)
|
| return SZ_ERROR_MEM;
|
| tempBuf[2] = (Byte *)IAlloc_Alloc(allocMain, tempSizes[2]);
|
| - if (tempBuf[2] == 0 && tempSizes[2] != 0)
|
| + if (!tempBuf[2] && tempSizes[2] != 0)
|
| return SZ_ERROR_MEM;
|
| - res = SzDecodeCopy(s3Size, inStream, tempBuf[2]);
|
| - RINOK(res)
|
| -
|
| - res = Bcj2_Decode(
|
| - tempBuf3, tempSize3,
|
| - tempBuf[0], tempSizes[0],
|
| - tempBuf[1], tempSizes[1],
|
| - tempBuf[2], tempSizes[2],
|
| - outBuffer, outSize);
|
| - RINOK(res)
|
| +
|
| + RINOK(LookInStream_SeekTo(inStream, startPos + offset));
|
| + RINOK(SzDecodeCopy(s3Size, inStream, tempBuf[2]));
|
| +
|
| + if ((tempSizes[0] & 3) != 0 ||
|
| + (tempSizes[1] & 3) != 0 ||
|
| + tempSize3 + tempSizes[0] + tempSizes[1] != outSize)
|
| + return SZ_ERROR_DATA;
|
| +
|
| + {
|
| + CBcj2Dec p;
|
| +
|
| + p.bufs[0] = tempBuf3; p.lims[0] = tempBuf3 + tempSize3;
|
| + p.bufs[1] = tempBuf[0]; p.lims[1] = tempBuf[0] + tempSizes[0];
|
| + p.bufs[2] = tempBuf[1]; p.lims[2] = tempBuf[1] + tempSizes[1];
|
| + p.bufs[3] = tempBuf[2]; p.lims[3] = tempBuf[2] + tempSizes[2];
|
| +
|
| + p.dest = outBuffer;
|
| + p.destLim = outBuffer + outSize;
|
| +
|
| + Bcj2Dec_Init(&p);
|
| + RINOK(Bcj2Dec_Decode(&p));
|
| +
|
| + {
|
| + unsigned i;
|
| + for (i = 0; i < 4; i++)
|
| + if (p.bufs[i] != p.lims[i])
|
| + return SZ_ERROR_DATA;
|
| +
|
| + if (!Bcj2Dec_IsFinished(&p))
|
| + return SZ_ERROR_DATA;
|
| +
|
| + if (p.dest != p.destLim
|
| + || p.state != BCJ2_STREAM_MAIN)
|
| + return SZ_ERROR_DATA;
|
| + }
|
| + }
|
| }
|
| - else
|
| + #ifndef _7Z_NO_METHODS_FILTERS
|
| + else if (ci == 1)
|
| {
|
| - if (ci != 1)
|
| - return SZ_ERROR_UNSUPPORTED;
|
| - switch(coder->MethodID)
|
| + if (coder->MethodID == k_Delta)
|
| {
|
| - case k_BCJ:
|
| + if (coder->PropsSize != 1)
|
| + return SZ_ERROR_UNSUPPORTED;
|
| {
|
| - UInt32 state;
|
| - x86_Convert_Init(state);
|
| - x86_Convert(outBuffer, outSize, 0, &state, 0);
|
| - break;
|
| + Byte state[DELTA_STATE_SIZE];
|
| + Delta_Init(state);
|
| + Delta_Decode(state, (unsigned)(propsData[coder->PropsOffset]) + 1, outBuffer, outSize);
|
| }
|
| - CASE_BRA_CONV(ARM)
|
| - default:
|
| + }
|
| + else
|
| + {
|
| + if (coder->PropsSize != 0)
|
| return SZ_ERROR_UNSUPPORTED;
|
| + switch (coder->MethodID)
|
| + {
|
| + case k_BCJ:
|
| + {
|
| + UInt32 state;
|
| + x86_Convert_Init(state);
|
| + x86_Convert(outBuffer, outSize, 0, &state, 0);
|
| + break;
|
| + }
|
| + CASE_BRA_CONV(PPC)
|
| + CASE_BRA_CONV(IA64)
|
| + CASE_BRA_CONV(SPARC)
|
| + CASE_BRA_CONV(ARM)
|
| + CASE_BRA_CONV(ARMT)
|
| + default:
|
| + return SZ_ERROR_UNSUPPORTED;
|
| + }
|
| }
|
| }
|
| + #endif
|
| + else
|
| + return SZ_ERROR_UNSUPPORTED;
|
| }
|
| +
|
| return SZ_OK;
|
| }
|
|
|
| -SRes SzFolder_Decode(const CSzFolder *folder, const UInt64 *packSizes,
|
| +
|
| +SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex,
|
| ILookInStream *inStream, UInt64 startPos,
|
| - Byte *outBuffer, size_t outSize, ISzAlloc *allocMain)
|
| + Byte *outBuffer, size_t outSize,
|
| + ISzAlloc *allocMain)
|
| {
|
| - Byte *tempBuf[3] = { 0, 0, 0};
|
| - int i;
|
| - SRes res = SzFolder_Decode2(folder, packSizes, inStream, startPos,
|
| - outBuffer, (SizeT)outSize, allocMain, tempBuf);
|
| - for (i = 0; i < 3; i++)
|
| - IAlloc_Free(allocMain, tempBuf[i]);
|
| - return res;
|
| + SRes res;
|
| + CSzFolder folder;
|
| + CSzData sd;
|
| +
|
| + const Byte *data = p->CodersData + p->FoCodersOffsets[folderIndex];
|
| + sd.Data = data;
|
| + sd.Size = p->FoCodersOffsets[folderIndex + 1] - p->FoCodersOffsets[folderIndex];
|
| +
|
| + res = SzGetNextFolderItem(&folder, &sd);
|
| +
|
| + if (res != SZ_OK)
|
| + return res;
|
| +
|
| + if (sd.Size != 0
|
| + || folder.UnpackStream != p->FoToMainUnpackSizeIndex[folderIndex]
|
| + || outSize != SzAr_GetFolderUnpackSize(p, folderIndex))
|
| + return SZ_ERROR_FAIL;
|
| + {
|
| + unsigned i;
|
| + Byte *tempBuf[3] = { 0, 0, 0};
|
| +
|
| + res = SzFolder_Decode2(&folder, data,
|
| + &p->CoderUnpackSizes[p->FoToCoderUnpackSizes[folderIndex]],
|
| + p->PackPositions + p->FoStartPackStreamIndex[folderIndex],
|
| + inStream, startPos,
|
| + outBuffer, (SizeT)outSize, allocMain, tempBuf);
|
| +
|
| + for (i = 0; i < 3; i++)
|
| + IAlloc_Free(allocMain, tempBuf[i]);
|
| +
|
| + if (res == SZ_OK)
|
| + if (SzBitWithVals_Check(&p->FolderCRCs, folderIndex))
|
| + if (CrcCalc(outBuffer, outSize) != p->FolderCRCs.Vals[folderIndex])
|
| + res = SZ_ERROR_CRC;
|
| +
|
| + return res;
|
| + }
|
| }
|
|
|