Backport decompression updates from new_engine

This commit is contained in:
vit9696 2018-05-08 19:22:07 +03:00
parent 9807ff36dc
commit 55c567b999
11 changed files with 3296 additions and 3312 deletions

View File

@ -43,9 +43,9 @@ RShiftU64 (
} }
VOID VOID
SetEncodedSizeOfBuf ( SetEncodedSizeOfBuf(
UINT64 EncodedSize, UINT64 EncodedSize,
UINT8 *EncodedData UINT8* EncodedData
) )
{ {
INT32 Index; INT32 Index;
@ -58,13 +58,13 @@ SetEncodedSizeOfBuf (
} }
} }
INT32 EFI_STATUS
EFIAPI EFIAPI
LzmaCompress( LzmaCompress (
CONST UINT8 *Source, CONST UINT8 *Source,
UINTN SourceSize, UINT32 SourceSize,
UINT8 *Destination, UINT8 *Destination,
UINTN *DestinationSize UINT32 *DestinationSize
) )
{ {
SRes LzmaResult; SRes LzmaResult;
@ -72,13 +72,14 @@ LzmaCompress(
SizeT propsSize = LZMA_PROPS_SIZE; SizeT propsSize = LZMA_PROPS_SIZE;
SizeT destLen = SourceSize + SourceSize / 3 + 128; SizeT destLen = SourceSize + SourceSize / 3 + 128;
if (*DestinationSize < destLen) if (*DestinationSize < (UINT32)destLen)
{ {
*DestinationSize = (UINTN)destLen; *DestinationSize = (UINT32)destLen;
return ERR_BUFFER_TOO_SMALL; return EFI_BUFFER_TOO_SMALL;
} }
LzmaEncProps_Init(&props); LzmaEncProps_Init(&props);
// TODO: need to detect this instead of hardcoding
props.dictSize = LZMA_DICTIONARY_SIZE; props.dictSize = LZMA_DICTIONARY_SIZE;
props.level = 9; props.level = 9;
props.fb = 273; props.fb = 273;
@ -87,7 +88,7 @@ LzmaCompress(
(Byte*)((UINT8*)Destination + LZMA_HEADER_SIZE), (Byte*)((UINT8*)Destination + LZMA_HEADER_SIZE),
&destLen, &destLen,
Source, Source,
SourceSize, (SizeT)SourceSize,
&props, &props,
(UINT8*)Destination, (UINT8*)Destination,
&propsSize, &propsSize,
@ -96,14 +97,14 @@ LzmaCompress(
&SzAllocForLzma, &SzAllocForLzma,
&SzAllocForLzma); &SzAllocForLzma);
*DestinationSize = destLen + LZMA_HEADER_SIZE; *DestinationSize = (UINT32)(destLen + LZMA_HEADER_SIZE);
SetEncodedSizeOfBuf(SourceSize, Destination); SetEncodedSizeOfBuf(SourceSize, Destination);
if (LzmaResult == SZ_OK) { if (LzmaResult == SZ_OK) {
return ERR_SUCCESS; return EFI_SUCCESS;
} }
else { else {
return ERR_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
} }

View File

@ -11,8 +11,8 @@
*/ */
#ifndef __LZMACOMPRESS_H__ #ifndef LZMACOMPRESS_H
#define __LZMACOMPRESS_H__ #define LZMACOMPRESS_H
#include "SDK/C/Types.h" #include "SDK/C/Types.h"
#include "../basetypes.h" #include "../basetypes.h"
@ -24,16 +24,17 @@ extern "C" {
#define LZMA_DICTIONARY_SIZE 0x800000 #define LZMA_DICTIONARY_SIZE 0x800000
#define _LZMA_SIZE_OPT #define _LZMA_SIZE_OPT
INT32 EFI_STATUS
EFIAPI EFIAPI
LzmaCompress( LzmaCompress (
const UINT8 *Source, const UINT8 *Source,
UINTN SourceSize, UINT32 SourceSize,
UINT8 *Destination, UINT8 *Destination,
UINTN *DestinationSize UINT32 *DestinationSize
); );
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif
#endif // LZMACOMPRESS_H

View File

@ -19,10 +19,10 @@ WITHWARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
UINT64 UINT64
EFIAPI EFIAPI
LShiftU64( LShiftU64 (
UINT64 Operand, UINT64 Operand,
UINT32 Count UINT32 Count
) )
{ {
return Operand << Count; return Operand << Count;
} }
@ -39,9 +39,9 @@ Get the size of the uncompressed buffer by parsing EncodeData header.
@return The size of the uncompressed buffer. @return The size of the uncompressed buffer.
*/ */
UINT64 UINT64
GetDecodedSizeOfBuf( GetDecodedSizeOfBuf (
UINT8 *EncodedData UINT8 *EncodedData
) )
{ {
UINT64 DecodedSize; UINT64 DecodedSize;
INT32 Index; INT32 Index;
@ -85,18 +85,27 @@ DestinationSize and the size of the scratch
buffer was returned ScratchSize. buffer was returned ScratchSize.
*/ */
INT32 EFI_STATUS
EFIAPI EFIAPI
LzmaGetInfo( LzmaGetInfo (
CONST VOID *Source, CONST VOID *Source,
UINTN SourceSize, UINT32 SourceSize,
UINTN *DestinationSize UINT32 *DestinationSize
) )
{ {
ASSERT(SourceSize >= LZMA_HEADER_SIZE); (void)SourceSize; UINT64 DecodedSize;
ASSERT(SourceSize >= LZMA_HEADER_SIZE);
(void)SourceSize;
*DestinationSize = (UINTN)GetDecodedSizeOfBuf((UINT8*)Source); DecodedSize = GetDecodedSizeOfBuf((UINT8*)Source);
if (DecodedSize <= UINT32_MAX) {
*DestinationSize = (UINT32)DecodedSize;
return ERR_SUCCESS; return ERR_SUCCESS;
}
else {
return ERR_INVALID_PARAMETER;
}
} }
/* /*
@ -118,13 +127,13 @@ the uncompressed buffer is returned Destination.
The source buffer specified by Source is corrupted The source buffer specified by Source is corrupted
(not a valid compressed format). (not a valid compressed format).
*/ */
INT32 EFI_STATUS
EFIAPI EFIAPI
LzmaDecompress( LzmaDecompress (
CONST VOID *Source, CONST VOID *Source,
UINTN SourceSize, UINT32 SourceSize,
VOID *Destination VOID *Destination
) )
{ {
SRes LzmaResult; SRes LzmaResult;
ELzmaStatus Status; ELzmaStatus Status;

View File

@ -11,8 +11,8 @@
*/ */
#ifndef __LZMADECOMPRESS_H__ #ifndef LZMADECOMPRESS_H
#define __LZMADECOMPRESS_H__ #define LZMADECOMPRESS_H
#include "../basetypes.h" #include "../basetypes.h"
#include "SDK/C/LzmaDec.h" #include "SDK/C/LzmaDec.h"
@ -23,13 +23,6 @@ extern "C" {
#define LZMA_HEADER_SIZE (LZMA_PROPS_SIZE + 8) #define LZMA_HEADER_SIZE (LZMA_PROPS_SIZE + 8)
UINT64
EFIAPI
LShiftU64(
UINT64 Operand,
UINT32 Count
);
/* /*
Given a Lzma compressed source buffer, this function retrieves the size of Given a Lzma compressed source buffer, this function retrieves the size of
the uncompressed buffer and the size of the scratch buffer required the uncompressed buffer and the size of the scratch buffer required
@ -57,12 +50,12 @@ extern "C" {
buffer was returned ScratchSize. buffer was returned ScratchSize.
*/ */
INT32 EFI_STATUS
EFIAPI EFIAPI
LzmaGetInfo( LzmaGetInfo (
const VOID *Source, CONST VOID *Source,
UINTN SourceSize, UINT32 SourceSize,
UINTN *DestinationSize UINT32 *DestinationSize
); );
/* /*
@ -84,15 +77,16 @@ extern "C" {
The source buffer specified by Source is corrupted The source buffer specified by Source is corrupted
(not a valid compressed format). (not a valid compressed format).
*/ */
INT32 EFI_STATUS
EFIAPI EFIAPI
LzmaDecompress( LzmaDecompress (
const VOID *Source, CONST VOID *Source,
UINTN SourceSize, UINT32 SourceSize,
VOID *Destination VOID *Destination
); );
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif
#endif // LZMADECOMPRESS_H

View File

@ -52,9 +52,9 @@ UINT8 gPBIT = 4;
#define NT (CODE_BIT + 3) #define NT (CODE_BIT + 3)
#define TBIT 5 #define TBIT 5
#if NT > NP #if NT > NP
#define NPT NT #define NPT NT
#else #else
#define NPT NP #define NPT NP
#endif #endif
// //
@ -65,160 +65,160 @@ STATIC
VOID VOID
PutDword( PutDword(
IN UINT32 Data IN UINT32 Data
); );
STATIC STATIC
EFI_STATUS EFI_STATUS
AllocateMemory(VOID); AllocateMemory (VOID);
STATIC STATIC
VOID VOID
FreeMemory(VOID); FreeMemory (VOID);
STATIC STATIC
VOID VOID
InitSlide(VOID); InitSlide (VOID);
STATIC STATIC
NODE NODE
Child( Child (
IN NODE q, IN NODE q,
IN UINT8 c IN UINT8 c
); );
STATIC STATIC
VOID VOID
MakeChild( MakeChild (
IN NODE q, IN NODE q,
IN UINT8 c, IN UINT8 c,
IN NODE r IN NODE r
); );
STATIC STATIC
VOID VOID
Split( Split (
IN NODE Old IN NODE Old
); );
STATIC STATIC
VOID VOID
InsertNode(VOID); InsertNode (VOID);
STATIC STATIC
VOID VOID
DeleteNode(VOID); DeleteNode (VOID);
STATIC STATIC
VOID VOID
GetNextMatch(VOID); GetNextMatch (VOID);
STATIC STATIC
EFI_STATUS EFI_STATUS
Encode(VOID); Encode (VOID);
STATIC STATIC
VOID VOID
CountTFreq(VOID); CountTFreq (VOID);
STATIC STATIC
VOID VOID
WritePTLen( WritePTLen (
IN INT32 n, IN INT32 n,
IN INT32 nbit, IN INT32 nbit,
IN INT32 Special IN INT32 Special
); );
STATIC STATIC
VOID VOID
WriteCLen(VOID); WriteCLen (VOID);
STATIC STATIC
VOID VOID
EncodeC( EncodeC (
IN INT32 c IN INT32 c
); );
STATIC STATIC
VOID VOID
EncodeP( EncodeP (
IN UINT32 p IN UINT32 p
); );
STATIC STATIC
VOID VOID
SendBlock(VOID); SendBlock (VOID);
STATIC STATIC
VOID VOID
Output( Output (
IN UINT32 c, IN UINT32 c,
IN UINT32 p IN UINT32 p
); );
STATIC STATIC
VOID VOID
HufEncodeStart(VOID); HufEncodeStart (VOID);
STATIC STATIC
VOID VOID
HufEncodeEnd(VOID); HufEncodeEnd (VOID);
STATIC STATIC
VOID VOID
MakeCrcTable(VOID); MakeCrcTable (VOID);
STATIC STATIC
VOID VOID
PutBits( PutBits (
IN INT32 n, IN INT32 n,
IN UINT32 x IN UINT32 x
); );
STATIC STATIC
INT32 INT32
FreadCrc( FreadCrc (
OUT UINT8 *p, OUT UINT8 *p,
IN INT32 n IN INT32 n
); );
STATIC STATIC
VOID VOID
InitPutBits(VOID); InitPutBits (VOID);
STATIC STATIC
VOID VOID
CountLen( CountLen (
IN INT32 i IN INT32 i
); );
STATIC STATIC
VOID VOID
MakeLen( MakeLen (
IN INT32 Root IN INT32 Root
); );
STATIC STATIC
VOID VOID
DownHeap( DownHeap (
IN INT32 i IN INT32 i
); );
STATIC STATIC
VOID VOID
MakeCode( MakeCode (
IN INT32 n, IN INT32 n,
IN UINT8 Len[], IN UINT8 Len[],
OUT UINT16 Code[] OUT UINT16 Code[]
); );
STATIC STATIC
INT32 INT32
MakeTree( MakeTree (
IN INT32 NParm, IN INT32 NParm,
IN UINT16 FreqParm[], IN UINT16 FreqParm[],
OUT UINT8 LenParm[], OUT UINT8 LenParm[],
OUT UINT16 CodeParm[] OUT UINT16 CodeParm[]
); );
// //
@ -234,8 +234,8 @@ STATIC UINT32 mBufSiz = 0, mOutputPos, mOutputMask, mSubBitBuf, mCrc;
STATIC UINT32 mCompSize, mOrigSize; STATIC UINT32 mCompSize, mOrigSize;
STATIC UINT16 *mFreq, *mSortPtr, mLenCnt[17], mLeft[2 * NC - 1], mRight[2 * NC - 1], STATIC UINT16 *mFreq, *mSortPtr, mLenCnt[17], mLeft[2 * NC - 1], mRight[2 * NC - 1],
mCrcTable[UINT8_MAX + 1], mCFreq[2 * NC - 1], mCCode[NC], mCrcTable[UINT8_MAX + 1], mCFreq[2 * NC - 1],mCCode[NC],
mPFreq[2 * NP - 1], mPTCode[NPT], mTFreq[2 * NT - 1]; mPFreq[2 * NP - 1], mPTCode[NPT], mTFreq[2 * NT - 1];
STATIC NODE mPos, mMatchPos, mAvail, *mPosition, *mParent, *mPrev, *mNext = NULL; STATIC NODE mPos, mMatchPos, mAvail, *mPosition, *mParent, *mPrev, *mNext = NULL;
@ -245,12 +245,12 @@ STATIC NODE mPos, mMatchPos, mAvail, *mPosition, *mParent, *mPrev, *mNext = NU
// //
EFI_STATUS EFI_STATUS
EfiCompress( EfiCompress (
IN CONST VOID *SrcBuffer, IN CONST VOID *SrcBuffer,
IN UINT32 SrcSize, IN UINT32 SrcSize,
IN VOID *DstBuffer, IN VOID *DstBuffer,
IN OUT UINT32 *DstSize IN OUT UINT32 *DstSize
) )
/*++ /*++
Routine Description: Routine Description:
@ -297,7 +297,7 @@ Returns:
PutDword(0L); PutDword(0L);
PutDword(0L); PutDword(0L);
MakeCrcTable(); MakeCrcTable ();
mOrigSize = mCompSize = 0; mOrigSize = mCompSize = 0;
mCrc = INIT_CRC; mCrc = INIT_CRC;
@ -307,7 +307,7 @@ Returns:
// //
Status = Encode(); Status = Encode();
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -322,7 +322,7 @@ Returns:
// Fill in compressed size and original size // Fill in compressed size and original size
// //
mDst = DstBuffer; mDst = DstBuffer;
PutDword(mCompSize + 1); PutDword(mCompSize+1);
PutDword(mOrigSize); PutDword(mOrigSize);
// //
@ -332,8 +332,7 @@ Returns:
if (mCompSize + 1 + 8 > *DstSize) { if (mCompSize + 1 + 8 > *DstSize) {
*DstSize = mCompSize + 1 + 8; *DstSize = mCompSize + 1 + 8;
return EFI_BUFFER_TOO_SMALL; return EFI_BUFFER_TOO_SMALL;
} } else {
else {
*DstSize = mCompSize + 1 + 8; *DstSize = mCompSize + 1 + 8;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -342,10 +341,10 @@ Returns:
EFI_STATUS EFI_STATUS
TianoCompress( TianoCompress(
IN CONST VOID *SrcBuffer, IN CONST VOID *SrcBuffer,
IN UINT32 SrcSize, IN UINT32 SrcSize,
IN VOID *DstBuffer, IN VOID *DstBuffer,
IN OUT UINT32 *DstSize IN OUT UINT32 *DstSize
) )
/*++ /*++
@ -440,7 +439,7 @@ STATIC
VOID VOID
PutDword( PutDword(
IN UINT32 Data IN UINT32 Data
) )
/*++ /*++
Routine Description: Routine Description:
@ -456,7 +455,7 @@ Returns: (VOID)
--*/ --*/
{ {
if (mDst < mDstUpperLimit) { if (mDst < mDstUpperLimit) {
*mDst++ = (UINT8)(((UINT8)(Data)) & 0xff); *mDst++ = (UINT8)(((UINT8)(Data )) & 0xff);
} }
if (mDst < mDstUpperLimit) { if (mDst < mDstUpperLimit) {
@ -474,7 +473,7 @@ Returns: (VOID)
STATIC STATIC
EFI_STATUS EFI_STATUS
AllocateMemory() AllocateMemory ()
/*++ /*++
Routine Description: Routine Description:
@ -492,20 +491,24 @@ Returns:
{ {
UINT32 i; UINT32 i;
mText = malloc(WNDSIZ * 2 + MAXMATCH); mText = malloc (WNDSIZ * 2 + MAXMATCH);
if (NULL == mText) if (!mText) return EFI_OUT_OF_RESOURCES;
return EFI_OUT_OF_RESOURCES; for (i = 0 ; i < WNDSIZ * 2 + MAXMATCH; i ++) {
for (i = 0; i < WNDSIZ * 2 + MAXMATCH; i++) {
mText[i] = 0; mText[i] = 0;
} }
mLevel = malloc((WNDSIZ + UINT8_MAX + 1) * sizeof(*mLevel)); mLevel = malloc((WNDSIZ + UINT8_MAX + 1) * sizeof(*mLevel));
if (!mLevel) return EFI_OUT_OF_RESOURCES;
mChildCount = malloc((WNDSIZ + UINT8_MAX + 1) * sizeof(*mChildCount)); mChildCount = malloc((WNDSIZ + UINT8_MAX + 1) * sizeof(*mChildCount));
if (!mChildCount) return EFI_OUT_OF_RESOURCES;
mPosition = malloc((WNDSIZ + UINT8_MAX + 1) * sizeof(*mPosition)); mPosition = malloc((WNDSIZ + UINT8_MAX + 1) * sizeof(*mPosition));
if (!mPosition) return EFI_OUT_OF_RESOURCES;
mParent = malloc(WNDSIZ * 2 * sizeof(*mParent)); mParent = malloc(WNDSIZ * 2 * sizeof(*mParent));
if (!mParent) return EFI_OUT_OF_RESOURCES;
mPrev = malloc(WNDSIZ * 2 * sizeof(*mPrev)); mPrev = malloc(WNDSIZ * 2 * sizeof(*mPrev));
if (!mPrev) return EFI_OUT_OF_RESOURCES;
mNext = malloc((MAX_HASH_VAL + 1) * sizeof(*mNext)); mNext = malloc((MAX_HASH_VAL + 1) * sizeof(*mNext));
if (!mNext) return EFI_OUT_OF_RESOURCES;
mBufSiz = 16 * 1024U; mBufSiz = 16 * 1024U;
while ((mBuf = malloc(mBufSiz)) == NULL) { while ((mBuf = malloc(mBufSiz)) == NULL) {
@ -520,7 +523,7 @@ Returns:
} }
VOID VOID
FreeMemory() FreeMemory ()
/*++ /*++
Routine Description: Routine Description:
@ -534,35 +537,35 @@ Returns: (VOID)
--*/ --*/
{ {
if (mText) { if (mText) {
free(mText); free (mText);
} }
if (mLevel) { if (mLevel) {
free(mLevel); free (mLevel);
} }
if (mChildCount) { if (mChildCount) {
free(mChildCount); free (mChildCount);
} }
if (mPosition) { if (mPosition) {
free(mPosition); free (mPosition);
} }
if (mParent) { if (mParent) {
free(mParent); free (mParent);
} }
if (mPrev) { if (mPrev) {
free(mPrev); free (mPrev);
} }
if (mNext) { if (mNext) {
free(mNext); free (mNext);
} }
if (mBuf) { if (mBuf) {
free(mBuf); free (mBuf);
} }
return; return;
@ -571,7 +574,7 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
InitSlide() InitSlide ()
/*++ /*++
Routine Description: Routine Description:
@ -607,10 +610,10 @@ Returns: (VOID)
STATIC STATIC
NODE NODE
Child( Child (
IN NODE q, IN NODE q,
IN UINT8 c IN UINT8 c
) )
/*++ /*++
Routine Description: Routine Description:
@ -641,11 +644,11 @@ Returns:
STATIC STATIC
VOID VOID
MakeChild( MakeChild (
IN NODE q, IN NODE q,
IN UINT8 c, IN UINT8 c,
IN NODE r IN NODE r
) )
/*++ /*++
Routine Description: Routine Description:
@ -677,8 +680,8 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
Split ( Split (
IN NODE Old NODE Old
) )
/*++ /*++
Routine Description: Routine Description:
@ -713,7 +716,7 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
InsertNode() InsertNode ()
/*++ /*++
Routine Description: Routine Description:
@ -755,8 +758,7 @@ Returns: (VOID)
if (t < (NODE)WNDSIZ) { if (t < (NODE)WNDSIZ) {
mPosition[t] = (NODE)(mPos | PERC_FLAG); mPosition[t] = (NODE)(mPos | PERC_FLAG);
} }
} } else {
else {
// //
// Locate the target tree // Locate the target tree
@ -778,12 +780,11 @@ Returns: (VOID)
// Node split or creation is involved. // Node split or creation is involved.
// //
for (; ; ) { for ( ; ; ) {
if (r >= (NODE)WNDSIZ) { if (r >= (NODE)WNDSIZ) {
j = MAXMATCH; j = MAXMATCH;
mMatchPos = r; mMatchPos = r;
} } else {
else {
j = mLevel[r]; j = mLevel[r];
mMatchPos = (NODE)(mPosition[r] & ~PERC_FLAG); mMatchPos = (NODE)(mPosition[r] & ~PERC_FLAG);
} }
@ -830,7 +831,7 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
DeleteNode() DeleteNode ()
/*++ /*++
Routine Description: Routine Description:
@ -904,7 +905,7 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
GetNextMatch() GetNextMatch ()
/*++ /*++
Routine Description: Routine Description:
@ -933,7 +934,7 @@ Returns: (VOID)
STATIC STATIC
EFI_STATUS EFI_STATUS
Encode() Encode ()
/*++ /*++
Routine Description: Routine Description:
@ -987,8 +988,7 @@ Returns:
// //
Output(mText[mPos - 1], 0); Output(mText[mPos - 1], 0);
} } else {
else {
// //
// Outputting a pointer is beneficial enough, do it. // Outputting a pointer is beneficial enough, do it.
@ -1012,7 +1012,7 @@ Returns:
STATIC STATIC
VOID VOID
CountTFreq() CountTFreq ()
/*++ /*++
Routine Description: Routine Description:
@ -1045,19 +1045,15 @@ Returns: (VOID)
} }
if (Count <= 2) { if (Count <= 2) {
mTFreq[0] = (UINT16)(mTFreq[0] + Count); mTFreq[0] = (UINT16)(mTFreq[0] + Count);
} } else if (Count <= 18) {
else if (Count <= 18) {
mTFreq[1]++; mTFreq[1]++;
} } else if (Count == 19) {
else if (Count == 19) {
mTFreq[0]++; mTFreq[0]++;
mTFreq[1]++; mTFreq[1]++;
} } else {
else {
mTFreq[2]++; mTFreq[2]++;
} }
} } else {
else {
mTFreq[k + 2]++; mTFreq[k + 2]++;
} }
} }
@ -1065,11 +1061,11 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
WritePTLen( WritePTLen (
IN INT32 n, IN INT32 n,
IN INT32 nbit, IN INT32 nbit,
IN INT32 Special IN INT32 Special
) )
/*++ /*++
Routine Description: Routine Description:
@ -1097,8 +1093,7 @@ Returns: (VOID)
k = mPTLen[i++]; k = mPTLen[i++];
if (k <= 6) { if (k <= 6) {
PutBits(3, k); PutBits(3, k);
} } else {
else {
PutBits(k - 3, (1U << (k - 3)) - 2); PutBits(k - 3, (1U << (k - 3)) - 2);
} }
if (i == Special) { if (i == Special) {
@ -1112,7 +1107,7 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
WriteCLen() WriteCLen ()
/*++ /*++
Routine Description: Routine Description:
@ -1145,22 +1140,18 @@ Returns: (VOID)
for (k = 0; k < Count; k++) { for (k = 0; k < Count; k++) {
PutBits(mPTLen[0], mPTCode[0]); PutBits(mPTLen[0], mPTCode[0]);
} }
} } else if (Count <= 18) {
else if (Count <= 18) {
PutBits(mPTLen[1], mPTCode[1]); PutBits(mPTLen[1], mPTCode[1]);
PutBits(4, Count - 3); PutBits(4, Count - 3);
} } else if (Count == 19) {
else if (Count == 19) {
PutBits(mPTLen[0], mPTCode[0]); PutBits(mPTLen[0], mPTCode[0]);
PutBits(mPTLen[1], mPTCode[1]); PutBits(mPTLen[1], mPTCode[1]);
PutBits(4, 15); PutBits(4, 15);
} } else {
else {
PutBits(mPTLen[2], mPTCode[2]); PutBits(mPTLen[2], mPTCode[2]);
PutBits(CBIT, Count - 20); PutBits(CBIT, Count - 20);
} }
} } else {
else {
PutBits(mPTLen[k + 2], mPTCode[k + 2]); PutBits(mPTLen[k + 2], mPTCode[k + 2]);
} }
} }
@ -1168,18 +1159,18 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
EncodeC( EncodeC (
IN INT32 c IN INT32 c
) )
{ {
PutBits(mCLen[c], mCCode[c]); PutBits(mCLen[c], mCCode[c]);
} }
STATIC STATIC
VOID VOID
EncodeP( EncodeP (
IN UINT32 p IN UINT32 p
) )
{ {
UINT32 c, q; UINT32 c, q;
@ -1197,7 +1188,7 @@ EncodeP(
STATIC STATIC
VOID VOID
SendBlock() SendBlock ()
/*++ /*++
Routine Description: Routine Description:
@ -1221,14 +1212,12 @@ Returns: (VOID)
Root = MakeTree(NT, mTFreq, mPTLen, mPTCode); Root = MakeTree(NT, mTFreq, mPTLen, mPTCode);
if (Root >= NT) { if (Root >= NT) {
WritePTLen(NT, TBIT, 3); WritePTLen(NT, TBIT, 3);
} } else {
else {
PutBits(TBIT, 0); PutBits(TBIT, 0);
PutBits(TBIT, Root); PutBits(TBIT, Root);
} }
WriteCLen(); WriteCLen();
} } else {
else {
PutBits(TBIT, 0); PutBits(TBIT, 0);
PutBits(TBIT, 0); PutBits(TBIT, 0);
PutBits(CBIT, 0); PutBits(CBIT, 0);
@ -1237,8 +1226,7 @@ Returns: (VOID)
Root = MakeTree(NP, mPFreq, mPTLen, mPTCode); Root = MakeTree(NP, mPFreq, mPTLen, mPTCode);
if (Root >= NP) { if (Root >= NP) {
WritePTLen(NP, gPBIT, -1); WritePTLen(NP, gPBIT, -1);
} } else {
else {
PutBits(gPBIT, 0); PutBits(gPBIT, 0);
PutBits(gPBIT, Root); PutBits(gPBIT, Root);
} }
@ -1246,8 +1234,7 @@ Returns: (VOID)
for (i = 0; i < Size; i++) { for (i = 0; i < Size; i++) {
if (i % UINT8_BIT == 0) { if (i % UINT8_BIT == 0) {
Flags = mBuf[Pos++]; Flags = mBuf[Pos++];
} } else {
else {
Flags <<= 1; Flags <<= 1;
} }
if (Flags & (1U << (UINT8_BIT - 1))) { if (Flags & (1U << (UINT8_BIT - 1))) {
@ -1255,8 +1242,7 @@ Returns: (VOID)
k = mBuf[Pos++] << UINT8_BIT; k = mBuf[Pos++] << UINT8_BIT;
k += mBuf[Pos++]; k += mBuf[Pos++];
EncodeP(k); EncodeP(k);
} } else {
else {
EncodeC(mBuf[Pos++]); EncodeC(mBuf[Pos++]);
} }
} }
@ -1271,10 +1257,10 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
Output( Output (
IN UINT32 c, IN UINT32 c,
IN UINT32 p IN UINT32 p
) )
/*++ /*++
Routine Description: Routine Description:
@ -1301,12 +1287,12 @@ Returns: (VOID)
CPos = mOutputPos++; CPos = mOutputPos++;
mBuf[CPos] = 0; mBuf[CPos] = 0;
} }
mBuf[mOutputPos++] = (UINT8)c; mBuf[mOutputPos++] = (UINT8) c;
mCFreq[c]++; mCFreq[c]++;
if (c >= (1U << UINT8_BIT)) { if (c >= (1U << UINT8_BIT)) {
mBuf[CPos] |= mOutputMask; mBuf[CPos] |= mOutputMask;
mBuf[mOutputPos++] = (UINT8)(p >> UINT8_BIT); mBuf[mOutputPos++] = (UINT8)(p >> UINT8_BIT);
mBuf[mOutputPos++] = (UINT8)p; mBuf[mOutputPos++] = (UINT8) p;
c = 0; c = 0;
while (p) { while (p) {
p >>= 1; p >>= 1;
@ -1318,7 +1304,7 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
HufEncodeStart() HufEncodeStart ()
{ {
INT32 i; INT32 i;
@ -1335,7 +1321,7 @@ HufEncodeStart()
STATIC STATIC
VOID VOID
HufEncodeEnd() HufEncodeEnd ()
{ {
SendBlock(); SendBlock();
@ -1350,7 +1336,7 @@ HufEncodeEnd()
STATIC STATIC
VOID VOID
MakeCrcTable() MakeCrcTable ()
{ {
UINT32 i, j, r; UINT32 i, j, r;
@ -1359,8 +1345,7 @@ MakeCrcTable()
for (j = 0; j < UINT8_BIT; j++) { for (j = 0; j < UINT8_BIT; j++) {
if (r & 1) { if (r & 1) {
r = (r >> 1) ^ CRCPOLY; r = (r >> 1) ^ CRCPOLY;
} } else {
else {
r >>= 1; r >>= 1;
} }
} }
@ -1370,10 +1355,10 @@ MakeCrcTable()
STATIC STATIC
VOID VOID
PutBits( PutBits (
IN INT32 n, IN INT32 n,
IN UINT32 x IN UINT32 x
) )
/*++ /*++
Routine Description: Routine Description:
@ -1393,8 +1378,7 @@ Returns: (VOID)
if (n < mBitCount) { if (n < mBitCount) {
mSubBitBuf |= x << (mBitCount -= n); mSubBitBuf |= x << (mBitCount -= n);
} } else {
else {
Temp = (UINT8)(mSubBitBuf | (x >> (n -= mBitCount))); Temp = (UINT8)(mSubBitBuf | (x >> (n -= mBitCount)));
if (mDst < mDstUpperLimit) { if (mDst < mDstUpperLimit) {
@ -1404,8 +1388,7 @@ Returns: (VOID)
if (n < UINT8_BIT) { if (n < UINT8_BIT) {
mSubBitBuf = x << (mBitCount = UINT8_BIT - n); mSubBitBuf = x << (mBitCount = UINT8_BIT - n);
} } else {
else {
Temp = (UINT8)(x >> (n - UINT8_BIT)); Temp = (UINT8)(x >> (n - UINT8_BIT));
if (mDst < mDstUpperLimit) { if (mDst < mDstUpperLimit) {
@ -1420,10 +1403,10 @@ Returns: (VOID)
STATIC STATIC
INT32 INT32
FreadCrc( FreadCrc (
OUT UINT8 *p, OUT UINT8 *p,
IN INT32 n IN INT32 n
) )
/*++ /*++
Routine Description: Routine Description:
@ -1459,7 +1442,7 @@ Returns:
STATIC STATIC
VOID VOID
InitPutBits() InitPutBits ()
{ {
mBitCount = UINT8_BIT; mBitCount = UINT8_BIT;
mSubBitBuf = 0; mSubBitBuf = 0;
@ -1467,9 +1450,9 @@ InitPutBits()
STATIC STATIC
VOID VOID
CountLen( CountLen (
IN INT32 i IN INT32 i
) )
/*++ /*++
Routine Description: Routine Description:
@ -1488,10 +1471,9 @@ Returns: (VOID)
if (i < mN) { if (i < mN) {
mLenCnt[(Depth < 16) ? Depth : 16]++; mLenCnt[(Depth < 16) ? Depth : 16]++;
} } else {
else {
Depth++; Depth++;
CountLen(mLeft[i]); CountLen(mLeft [i]);
CountLen(mRight[i]); CountLen(mRight[i]);
Depth--; Depth--;
} }
@ -1499,9 +1481,9 @@ Returns: (VOID)
STATIC STATIC
VOID VOID
MakeLen( MakeLen (
IN INT32 Root IN INT32 Root
) )
/*++ /*++
Routine Description: Routine Description:
@ -1536,7 +1518,7 @@ Arguments:
for (i = 15; i > 0; i--) { for (i = 15; i > 0; i--) {
if (mLenCnt[i] != 0) { if (mLenCnt[i] != 0) {
mLenCnt[i]--; mLenCnt[i]--;
mLenCnt[i + 1] += 2; mLenCnt[i+1] += 2;
break; break;
} }
} }
@ -1552,9 +1534,9 @@ Arguments:
STATIC STATIC
VOID VOID
DownHeap( DownHeap (
IN INT32 i IN INT32 i
) )
{ {
INT32 j, k; INT32 j, k;
@ -1578,11 +1560,11 @@ DownHeap(
STATIC STATIC
VOID VOID
MakeCode( MakeCode (
IN INT32 n, IN INT32 n,
IN UINT8 Len[], IN UINT8 Len[],
OUT UINT16 Code[] OUT UINT16 Code[]
) )
/*++ /*++
Routine Description: Routine Description:
@ -1613,12 +1595,12 @@ Returns: (VOID)
STATIC STATIC
INT32 INT32
MakeTree( MakeTree (
IN INT32 NParm, IN INT32 NParm,
IN UINT16 FreqParm[], IN UINT16 FreqParm[],
OUT UINT8 LenParm[], OUT UINT8 LenParm[],
OUT UINT16 CodeParm[] OUT UINT16 CodeParm[]
) )
/*++ /*++
Routine Description: Routine Description:

View File

@ -20,8 +20,8 @@ Header file for compression routine.
*/ */
#ifndef _EFITIANOCOMPRESS_H_ #ifndef EFITIANOCOMPRESS_H
#define _EFITIANOCOMPRESS_H_ #define EFITIANOCOMPRESS_H
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
@ -57,11 +57,12 @@ extern "C" {
--*/ --*/
EFI_STATUS EFI_STATUS
TianoCompress( TianoCompress(
IN CONST VOID *SrcBuffer, CONST VOID *SrcBuffer,
IN UINT32 SrcSize, UINT32 SrcSize,
IN VOID *DstBuffer, VOID *DstBuffer,
IN OUT UINT32 *DstSize UINT32 *DstSize
); )
;
EFI_STATUS EFI_STATUS
TianoCompressLegacy( TianoCompressLegacy(
@ -69,7 +70,8 @@ extern "C" {
UINT32 SrcSize, UINT32 SrcSize,
VOID *DstBuffer, VOID *DstBuffer,
UINT32 *DstSize UINT32 *DstSize
); )
;
/*++ /*++
Routine Description: Routine Description:
@ -95,21 +97,22 @@ extern "C" {
--*/ --*/
EFI_STATUS EFI_STATUS
EfiCompress( EfiCompress(
IN CONST VOID *SrcBuffer, CONST VOID *SrcBuffer,
IN UINT32 SrcSize, UINT32 SrcSize,
IN VOID *DstBuffer, VOID *DstBuffer,
IN OUT UINT32 *DstSize UINT32 *DstSize
); )
;
EFI_STATUS EFI_STATUS
EfiCompressLegacy( EfiCompressLegacy(
CONST VOID *SrcBuffer, CONST VOID *SrcBuffer,
UINT32 SrcSize, UINT32 SrcSize,
VOID *DstBuffer, VOID *DstBuffer,
UINT32 *DstSize UINT32 *DstSize
); )
;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif // EFITIANOCOMPRESS_H

File diff suppressed because it is too large Load Diff

View File

@ -82,8 +82,8 @@ typedef struct {
STATIC STATIC
VOID VOID
FillBuf( FillBuf(
IN SCRATCH_DATA *Sd, IN SCRATCH_DATA *Sd,
IN UINT16 NumOfBits IN UINT16 NumOfBits
) )
/*++ /*++
@ -130,8 +130,8 @@ Returns: (VOID)
STATIC STATIC
UINT32 UINT32
GetBits( GetBits(
IN SCRATCH_DATA *Sd, IN SCRATCH_DATA *Sd,
IN UINT16 NumOfBits IN UINT16 NumOfBits
) )
/*++ /*++
@ -164,11 +164,11 @@ The bits that are popped out.
STATIC STATIC
UINT16 UINT16
MakeTable( MakeTable(
IN SCRATCH_DATA *Sd, IN SCRATCH_DATA *Sd,
IN UINT16 NumOfChar, IN UINT16 NumOfChar,
IN UINT8 *BitLen, IN UINT8 *BitLen,
IN UINT16 TableBits, IN UINT16 TableBits,
OUT UINT16 *Table OUT UINT16 *Table
) )
/*++ /*++
@ -324,7 +324,7 @@ BAD_TABLE - The table is corrupted.
STATIC STATIC
UINT32 UINT32
DecodeP( DecodeP(
IN SCRATCH_DATA *Sd IN SCRATCH_DATA *Sd
) )
/*++ /*++
@ -378,10 +378,10 @@ The position value decoded.
STATIC STATIC
UINT16 UINT16
ReadPTLen( ReadPTLen(
IN SCRATCH_DATA *Sd, IN SCRATCH_DATA *Sd,
IN UINT16 nn, IN UINT16 nn,
IN UINT16 nbit, IN UINT16 nbit,
IN UINT16 Special IN UINT16 Special
) )
/*++ /*++
@ -472,7 +472,7 @@ BAD_TABLE - Table is corrupted.
STATIC STATIC
VOID VOID
ReadCLen( ReadCLen(
SCRATCH_DATA *Sd SCRATCH_DATA *Sd
) )
/*++ /*++
@ -563,7 +563,7 @@ Returns: (VOID)
STATIC STATIC
UINT16 UINT16
DecodeC( DecodeC(
SCRATCH_DATA *Sd SCRATCH_DATA *Sd
) )
/*++ /*++
@ -630,7 +630,7 @@ The value decoded.
STATIC STATIC
VOID VOID
Decode( Decode(
SCRATCH_DATA *Sd SCRATCH_DATA *Sd
) )
/*++ /*++
@ -702,10 +702,10 @@ Returns: (VOID)
EFI_STATUS EFI_STATUS
GetInfo( GetInfo(
IN const VOID *Source, IN const VOID *Source,
IN UINT32 SrcSize, IN UINT32 SrcSize,
OUT UINT32 *DstSize, OUT UINT32 *DstSize,
OUT UINT32 *ScratchSize OUT UINT32 *ScratchSize
) )
/*++ /*++
@ -742,13 +742,13 @@ EFI_INVALID_PARAMETER - The source data is corrupted
EFI_STATUS EFI_STATUS
Decompress( Decompress(
IN const VOID *Source, IN const VOID *Source,
IN UINT32 SrcSize, IN UINT32 SrcSize,
IN OUT VOID *Destination, IN OUT VOID *Destination,
IN UINT32 DstSize, IN UINT32 DstSize,
IN OUT VOID *Scratch, IN OUT VOID *Scratch,
IN UINT32 ScratchSize, IN UINT32 ScratchSize,
IN UINT8 Version IN UINT8 Version
) )
/*++ /*++
@ -869,10 +869,10 @@ EFI_INVALID_PARAMETER - The source data is corrupted
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EfiTianoGetInfo( EfiTianoGetInfo(
IN const VOID *Source, IN const VOID *Source,
IN UINT32 SrcSize, IN UINT32 SrcSize,
OUT UINT32 *DstSize, OUT UINT32 *DstSize,
OUT UINT32 *ScratchSize OUT UINT32 *ScratchSize
) )
/*++ /*++
@ -906,12 +906,12 @@ EFI_INVALID_PARAMETER - The source data is corrupted
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EfiDecompress( EfiDecompress(
IN const VOID *Source, IN const VOID *Source,
IN UINT32 SrcSize, IN UINT32 SrcSize,
IN OUT VOID *Destination, IN OUT VOID *Destination,
IN UINT32 DstSize, IN UINT32 DstSize,
IN OUT VOID *Scratch, IN OUT VOID *Scratch,
IN UINT32 ScratchSize IN UINT32 ScratchSize
) )
/*++ /*++
@ -953,12 +953,12 @@ EFI_INVALID_PARAMETER - The source data is corrupted
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TianoDecompress( TianoDecompress(
IN const VOID *Source, IN const VOID *Source,
IN UINT32 SrcSize, IN UINT32 SrcSize,
IN OUT VOID *Destination, IN OUT VOID *Destination,
IN UINT32 DstSize, IN UINT32 DstSize,
IN OUT VOID *Scratch, IN OUT VOID *Scratch,
IN UINT32 ScratchSize IN UINT32 ScratchSize
) )
/*++ /*++

View File

@ -21,8 +21,8 @@ Providing both EFI and Tiano decompress algorithms.
--*/ --*/
#ifndef _EFITIANODECOMPRESS_H_ #ifndef EFITIANODECOMPRESS_H
#define _EFITIANODECOMPRESS_H_ #define EFITIANODECOMPRESS_H
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
@ -32,109 +32,107 @@ Providing both EFI and Tiano decompress algorithms.
extern "C" { extern "C" {
#endif #endif
typedef struct { typedef struct EFI_TIANO_HEADER_ {
UINT32 CompSize; UINT32 CompSize;
UINT32 OrigSize; UINT32 OrigSize;
} EFI_TIANO_HEADER; } EFI_TIANO_HEADER;
EFI_STATUS EFI_STATUS
EfiTianoGetInfo( EFIAPI
IN const VOID *Source, EfiTianoGetInfo(
IN UINT32 SrcSize, const VOID *Source,
OUT UINT32 *DstSize, UINT32 SrcSize,
OUT UINT32 *ScratchSize UINT32 *DstSize,
UINT32 *ScratchSize
) )
/*++ /*++
Routine Description: Routine Description:
The implementation is same as that of EFI_DECOMPRESS_PROTOCOL.GetInfo(). The implementation is same as that of EFI_DECOMPRESS_PROTOCOL.GetInfo().
Arguments: Arguments:
This - The protocol instance pointer Source - The source buffer containing the compressed data.
Source - The source buffer containing the compressed data. SrcSize - The size of source buffer
SrcSize - The size of source buffer DstSize - The size of destination buffer.
DstSize - The size of destination buffer. ScratchSize - The size of scratch buffer.
ScratchSize - The size of scratch buffer.
Returns: Returns:
EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successfully retrieved. EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successfully retrieved.
EFI_INVALID_PARAMETER - The source data is corrupted EFI_INVALID_PARAMETER - The source data is corrupted
--*/ --*/
; ;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EfiDecompress( EfiDecompress(
IN const VOID *Source, const VOID *Source,
IN UINT32 SrcSize, UINT32 SrcSize,
IN OUT VOID *Destination, VOID *Destination,
IN UINT32 DstSize, UINT32 DstSize,
IN OUT VOID *Scratch, VOID *Scratch,
IN UINT32 ScratchSize UINT32 ScratchSize
);
/*++
Routine Description:
The implementation is same as that of EFI_DECOMPRESS_PROTOCOL.Decompress().
Arguments:
Source - The source buffer containing the compressed data.
SrcSize - The size of source buffer
Destination - The destination buffer to store the decompressed data
DstSize - The size of destination buffer.
Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data.
ScratchSize - The size of scratch buffer.
Returns:
EFI_SUCCESS - Decompression is successful
EFI_INVALID_PARAMETER - The source data is corrupted
--*/
;
EFI_STATUS
EFIAPI
TianoDecompress(
const VOID *Source,
UINT32 SrcSize,
VOID *Destination,
UINT32 DstSize,
VOID *Scratch,
UINT32 ScratchSize
) )
/*++ /*++
Routine Description: Routine Description:
The implementation is same as that of EFI_DECOMPRESS_PROTOCOL.Decompress(). The implementation is same as that of EFI_TIANO_DECOMPRESS_PROTOCOL.Decompress().
Arguments: Arguments:
This - The protocol instance pointer Source - The source buffer containing the compressed data.
Source - The source buffer containing the compressed data. SrcSize - The size of source buffer
SrcSize - The size of source buffer Destination - The destination buffer to store the decompressed data
Destination - The destination buffer to store the decompressed data DstSize - The size of destination buffer.
DstSize - The size of destination buffer. Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data.
Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. ScratchSize - The size of scratch buffer.
ScratchSize - The size of scratch buffer.
Returns: Returns:
EFI_SUCCESS - Decompression is successful EFI_SUCCESS - Decompression is successful
EFI_INVALID_PARAMETER - The source data is corrupted EFI_INVALID_PARAMETER - The source data is corrupted
--*/ --*/
; ;
EFI_STATUS
EFIAPI
TianoDecompress(
IN const VOID *Source,
IN UINT32 SrcSize,
IN OUT VOID *Destination,
IN UINT32 DstSize,
IN OUT VOID *Scratch,
IN UINT32 ScratchSize
)
/*++
Routine Description:
The implementation is same as that of EFI_TIANO_DECOMPRESS_PROTOCOL.Decompress().
Arguments:
This - The protocol instance pointer
Source - The source buffer containing the compressed data.
SrcSize - The size of source buffer
Destination - The destination buffer to store the decompressed data
DstSize - The size of destination buffer.
Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data.
ScratchSize - The size of scratch buffer.
Returns:
EFI_SUCCESS - Decompression is successful
EFI_INVALID_PARAMETER - The source data is corrupted
--*/
;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif // EFITIANODECOMPRESS_H

View File

@ -16,6 +16,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <stdarg.h> #include <stdarg.h>
#include <stdint.h> #include <stdint.h>
#include <stddef.h>
typedef uint8_t BOOLEAN; typedef uint8_t BOOLEAN;
typedef int8_t INT8; typedef int8_t INT8;
@ -28,7 +29,7 @@ typedef int64_t INT64;
typedef uint64_t UINT64; typedef uint64_t UINT64;
typedef char CHAR8; typedef char CHAR8;
typedef uint16_t CHAR16; typedef uint16_t CHAR16;
typedef unsigned int UINTN; typedef size_t UINTN;
#define CONST const #define CONST const
#define VOID void #define VOID void

View File

@ -2741,7 +2741,13 @@ UINT8 FfsEngine::decompress(const QByteArray & compressedData, const UINT8 compr
else if (algorithm) else if (algorithm)
*algorithm = COMPRESSION_ALGORITHM_TIANO; *algorithm = COMPRESSION_ALGORITHM_TIANO;
decompressedData = QByteArray((const char*)decompressed, decompressedSize); if (decompressedSize > INT32_MAX) {
delete[] decompressed;
delete[] scratch;
return ERR_STANDARD_DECOMPRESSION_FAILED;
}
decompressedData = QByteArray((const char*)decompressed, (int)decompressedSize);
delete[] decompressed; delete[] decompressed;
delete[] scratch; delete[] scratch;
@ -2778,7 +2784,8 @@ UINT8 FfsEngine::decompress(const QByteArray & compressedData, const UINT8 compr
} }
// Decompress section data again // Decompress section data again
if (ERR_SUCCESS != LzmaDecompress(data, dataSize, decompressed)) { if (ERR_SUCCESS != LzmaDecompress(data, dataSize, decompressed)
|| decompressedSize > INT32_MAX) {
if (algorithm) if (algorithm)
*algorithm = COMPRESSION_ALGORITHM_UNKNOWN; *algorithm = COMPRESSION_ALGORITHM_UNKNOWN;
delete[] decompressed; delete[] decompressed;
@ -2787,13 +2794,17 @@ UINT8 FfsEngine::decompress(const QByteArray & compressedData, const UINT8 compr
else { else {
if (algorithm) if (algorithm)
*algorithm = COMPRESSION_ALGORITHM_IMLZMA; *algorithm = COMPRESSION_ALGORITHM_IMLZMA;
decompressedData = QByteArray((const char*)decompressed, decompressedSize); decompressedData = QByteArray((const char*)decompressed, (int)decompressedSize);
} }
} }
else { else {
if (decompressedSize > INT32_MAX) {
delete[] decompressed;
return ERR_CUSTOMIZED_DECOMPRESSION_FAILED;
}
if (algorithm) if (algorithm)
*algorithm = COMPRESSION_ALGORITHM_LZMA; *algorithm = COMPRESSION_ALGORITHM_LZMA;
decompressedData = QByteArray((const char*)decompressed, decompressedSize); decompressedData = QByteArray((const char*)decompressed, (int)decompressedSize);
} }
delete[] decompressed; delete[] decompressed;