This commit is contained in:
Igor Pavlov
2019-03-04 01:27:14 +00:00
committed by glachancecmaisonneuve
parent 5d7485c7d9
commit 5c10d25476
75 changed files with 2075 additions and 1688 deletions

View File

@@ -355,7 +355,9 @@ HRESULT CDecoder::Decode(
unsigned i;
#if !defined(_7ZIP_ST)
bool mt_wasUsed = false;
#endif
for (i = 0; i < folderInfo.Coders.Size(); i++)
{

View File

@@ -1,12 +1,12 @@
EXPORTS
CreateObject PRIVATE
GetHandlerProperty PRIVATE
GetNumberOfFormats PRIVATE
GetHandlerProperty2 PRIVATE
GetIsArc PRIVATE
SetCodecs PRIVATE
SetLargePageMode PRIVATE
SetCaseSensitive PRIVATE
EXPORTS
CreateObject PRIVATE
GetHandlerProperty PRIVATE
GetNumberOfFormats PRIVATE
GetHandlerProperty2 PRIVATE
GetIsArc PRIVATE
SetCodecs PRIVATE
SetLargePageMode PRIVATE
SetCaseSensitive PRIVATE

View File

@@ -1,19 +1,19 @@
EXPORTS
CreateObject PRIVATE
GetHandlerProperty PRIVATE
GetNumberOfFormats PRIVATE
GetHandlerProperty2 PRIVATE
GetIsArc PRIVATE
GetNumberOfMethods PRIVATE
GetMethodProperty PRIVATE
CreateDecoder PRIVATE
CreateEncoder PRIVATE
GetHashers PRIVATE
SetCodecs PRIVATE
SetLargePageMode PRIVATE
SetCaseSensitive PRIVATE
EXPORTS
CreateObject PRIVATE
GetHandlerProperty PRIVATE
GetNumberOfFormats PRIVATE
GetHandlerProperty2 PRIVATE
GetIsArc PRIVATE
GetNumberOfMethods PRIVATE
GetMethodProperty PRIVATE
CreateDecoder PRIVATE
CreateEncoder PRIVATE
GetHashers PRIVATE
SetCodecs PRIVATE
SetLargePageMode PRIVATE
SetCaseSensitive PRIVATE

View File

@@ -733,7 +733,13 @@ HRESULT CDatabase::Open()
RINOK(OpenProgressFat());
if ((Fat[0] & 0xFF) != Header.MediaType)
return S_FALSE;
{
// that case can mean error in FAT,
// but xdf file: (MediaType == 0xF0 && Fat[0] == 0xFF9)
// 19.00: so we use non-strict check
if ((Fat[0] & 0xFF) < 0xF0)
return S_FALSE;
}
RINOK(ReadDir(-1, Header.RootCluster, 0));

View File

@@ -41,9 +41,8 @@ static const UInt32 k_Signature32 = 0x00004550;
static HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 excludePos, UInt32 &res)
{
const UInt32 kBufSizeMax = (UInt32)1 << 16;
UInt32 bufSize = MyMin(kBufSizeMax, size);
bufSize += (bufSize & 1);
const UInt32 kBufSizeMax = (UInt32)1 << 15;
UInt32 bufSize = kBufSizeMax;
CByteBuffer buffer(bufSize);
Byte *buf = buffer;
UInt32 sum = 0;
@@ -58,9 +57,6 @@ static HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 exc
size_t processed = rem;
RINOK(ReadStream(stream, buf, &processed));
if ((processed & 1) != 0)
buf[processed] = 0;
for (unsigned j = 0; j < 4; j++)
{
UInt32 e = excludePos + j;
@@ -72,11 +68,30 @@ static HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 exc
}
}
for (size_t i = 0; i < processed; i += 2)
const unsigned kStep = (1 << 4);
{
sum += Get16(buf + i);
sum = (sum + (sum >> 16)) & 0xFFFF;
for (size_t i = processed; (i & (kStep - 1)) != 0; i++)
buf[i] = 0;
}
{
const Byte *buf2 = buf;
const Byte *bufLimit = buf + processed;
UInt64 sum2 = 0;
for (; buf2 < bufLimit; buf2 += kStep)
{
UInt64 sum3 = (UInt64)Get32(buf2)
+ Get32(buf2 + 4)
+ Get32(buf2 + 8)
+ Get32(buf2 + 12);
sum2 += sum3;
}
sum2 = (UInt32)(sum2) + (UInt64)(sum2 >> 32);
UInt32 sum3 = ((UInt32)sum2 + (UInt32)(sum2 >> 32));
sum += (sum3 & 0xFFFF) + (sum3 >> 16);
sum = (sum & 0xFFFF) + (sum >> 16);
sum = (sum & 0xFFFF) + (sum >> 16);
}
pos += (UInt32)processed;
if (rem != processed)
break;

View File

@@ -7,6 +7,7 @@
#include "../../../Common/ComTry.h"
#include "../../../Common/IntToString.h"
#include "../../../Common/MyBuffer2.h"
#include "../../../Common/UTFConvert.h"
#include "../../../Windows/PropVariantUtils.h"
@@ -104,37 +105,6 @@ static const char * const g_LinkTypes[] =
static const char g_ExtraTimeFlags[] = { 'u', 'M', 'C', 'A', 'n' };
template <unsigned alignMask>
struct CAlignedBuffer
{
Byte *_buf;
Byte *_bufBase;
size_t _size;
CAlignedBuffer(): _buf(NULL), _bufBase(NULL), _size(0) {}
~CAlignedBuffer() { ::MyFree(_bufBase); }
public:
operator Byte *() { return _buf; }
operator const Byte *() const { return _buf; }
void AllocAtLeast(size_t size)
{
if (_buf && _size >= size)
return;
::MyFree(_bufBase);
_buf = NULL;
_size = 0;
_bufBase = (Byte *)::MyAlloc(size + alignMask);
if (_bufBase)
{
_size = size;
// _buf = (Byte *)(((uintptr_t)_bufBase + alignMask) & ~(uintptr_t)alignMask);
_buf = (Byte *)(((ptrdiff_t)_bufBase + alignMask) & ~(ptrdiff_t)alignMask);
}
}
};
static unsigned ReadVarInt(const Byte *p, size_t maxSize, UInt64 *val)
{
*val = 0;
@@ -578,7 +548,7 @@ STDMETHODIMP COutStreamWithHash::Write(const void *data, UInt32 size, UInt32 *pr
class CInArchive
{
CAlignedBuffer<AES_BLOCK_SIZE - 1> _buf;
CAlignedBuffer _buf;
size_t _bufSize;
size_t _bufPos;
ISequentialInStream *_stream;
@@ -586,7 +556,7 @@ class CInArchive
NCrypto::NRar5::CDecoder *m_CryptoDecoderSpec;
CMyComPtr<ICompressFilter> m_CryptoDecoder;
CLASS_NO_COPY(CInArchive)
HRESULT ReadStream_Check(void *data, size_t size);
@@ -610,6 +580,8 @@ public:
UInt64 DataSize;
};
CInArchive() {}
HRESULT ReadBlockHeader(CHeader &h);
bool ReadFileHeader(const CHeader &header, CItem &item);
void AddToSeekValue(UInt64 addValue)

View File

@@ -6,6 +6,7 @@
#include "../../../Common/ComTry.h"
#include "../../../Common/IntToString.h"
#include "../../../Common/MyBuffer2.h"
#include "../../../Common/UTFConvert.h"
#include "../../../Windows/PropVariantUtils.h"
@@ -136,8 +137,7 @@ class CInArchive
NHeader::NBlock::CBlock m_BlockHeader;
NCrypto::NRar3::CDecoder *m_RarAESSpec;
CMyComPtr<ICompressFilter> m_RarAES;
CByteBuffer m_DecryptedData;
Byte *m_DecryptedDataAligned;
CAlignedBuffer m_DecryptedDataAligned;
UInt32 m_DecryptedDataSize;
bool m_CryptoMode;
UInt32 m_CryptoPos;
@@ -553,11 +553,12 @@ HRESULT CInArchive::GetNextItem(CItem &item, ICryptoGetTextPassword *getTextPass
m_RarAESSpec->SetPassword((const Byte *)buffer, len * 2);
const UInt32 kDecryptedBufferSize = (1 << 12);
if (m_DecryptedData.Size() == 0)
if (m_DecryptedDataAligned.Size() == 0)
{
const UInt32 kAlign = 16;
m_DecryptedData.Alloc(kDecryptedBufferSize + kAlign);
m_DecryptedDataAligned = (Byte *)((ptrdiff_t)((Byte *)m_DecryptedData + kAlign - 1) & ~(ptrdiff_t)(kAlign - 1));
// const UInt32 kAlign = 16;
m_DecryptedDataAligned.AllocAtLeast(kDecryptedBufferSize);
if (!m_DecryptedDataAligned.IsAllocated())
return E_OUTOFMEMORY;
}
RINOK(m_RarAES->Init());
size_t decryptedDataSizeT = kDecryptedBufferSize;

View File

@@ -791,20 +791,24 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
void CHandler::AddCommentString(const char *name, UInt32 pos)
{
UString s;
const Byte *buf = _bufs[0];
if (pos < _h.HeaderSize)
return;
for (UInt32 i = pos;; i += 2)
if (pos >= _h.OffsetToCapsuleBody)
return;
UInt32 limit = (_h.OffsetToCapsuleBody - pos) & ~(UInt32)1;
const Byte *buf = _bufs[0] + pos;
for (UInt32 i = 0;;)
{
if (s.Len() > (1 << 16) || i >= _h.OffsetToCapsuleBody)
if (s.Len() > (1 << 16) || i >= limit)
return;
wchar_t c = Get16(buf + i);
i += 2;
if (c == 0)
{
i += 2;
if (i >= _h.OffsetToCapsuleBody)
if (i >= limit)
return;
c = Get16(buf + i);
i += 2;
if (c == 0)
break;
s.Add_LF();

View File

@@ -671,7 +671,7 @@ void CHeader::SetDefaultFields(bool useLZX)
ChunkSize = kChunkSize;
ChunkSizeBits = kChunkSizeBits;
}
g_RandomGenerator.Generate(Guid, 16);
MY_RAND_GEN(Guid, 16);
PartNumber = 1;
NumParts = 1;
NumImages = 1;