Update to 7-Zip 16.03

This commit is contained in:
Tino Reichardt
2016-09-29 20:02:18 +02:00
parent a2f0a60c42
commit 0e6c1206d2
87 changed files with 1201 additions and 386 deletions

View File

@@ -72,6 +72,13 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
break;
}
case kpidWarningFlags:
{
if (_warning)
prop = kpv_ErrorFlags_HeadersError;
break;
}
case kpidCodePage:
{
const char *name = NULL;
@@ -98,7 +105,13 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
HRESULT CHandler::ReadItem2(ISequentialInStream *stream, bool &filled, CItemEx &item)
{
item.HeaderPos = _phySize;
RINOK(ReadItem(stream, filled, item, _error));
EErrorType error;
HRESULT res = ReadItem(stream, filled, item, error);
if (error == k_ErrorType_Warning)
_warning = true;
else if (error != k_ErrorType_OK)
_error = error;
RINOK(res);
if (filled)
{
/*
@@ -233,6 +246,7 @@ STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
STDMETHODIMP CHandler::Close()
{
_isArc = false;
_warning = false;
_error = k_ErrorType_OK;
_phySizeDefined = false;

View File

@@ -37,6 +37,7 @@ private:
UInt64 _headersSize;
bool _phySizeDefined;
EErrorType _error;
bool _warning;
bool _isArc;
// bool _isSparse;

View File

@@ -75,7 +75,7 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt
{
COM_TRY_BEGIN
if ((_stream && (_error != k_ErrorType_OK /* || _isSparse */)) || _seqStream)
if ((_stream && (_error != k_ErrorType_OK || _warning /* || _isSparse */)) || _seqStream)
return E_NOTIMPL;
CObjectVector<CUpdateItem> updateItems;
UINT codePage = (_forceCodePage ? _specifiedCodePage : _openCodePage);

View File

@@ -328,13 +328,63 @@ static HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemE
return S_OK;
}
static HRESULT ReadDataToString(ISequentialInStream *stream, CItemEx &item, AString &s, EErrorType &error)
{
const unsigned packSize = (unsigned)item.GetPackSizeAligned();
size_t processedSize = packSize;
HRESULT res = ReadStream(stream, s.GetBuf(packSize), &processedSize);
item.HeaderSize += (unsigned)processedSize;
s.ReleaseBuf_CalcLen((unsigned)item.PackSize);
RINOK(res);
if (processedSize != packSize)
error = k_ErrorType_UnexpectedEnd;
return S_OK;
}
static bool ParsePaxLongName(const AString &src, AString &dest)
{
dest.Empty();
for (unsigned pos = 0;;)
{
if (pos >= src.Len())
return false;
const char *start = src.Ptr(pos);
const char *end;
const UInt32 lineLen = ConvertStringToUInt32(start, &end);
if (end == start)
return false;
if (*end != ' ')
return false;
if (lineLen > src.Len() - pos)
return false;
unsigned offset = (unsigned)(end - start) + 1;
if (lineLen < offset)
return false;
if (IsString1PrefixedByString2(src.Ptr(pos + offset), "path="))
{
offset += 5; // "path="
dest = src.Mid(pos + offset, lineLen - offset);
if (dest.IsEmpty())
return false;
if (dest.Back() != '\n')
return false;
dest.DeleteBack();
return true;
}
pos += lineLen;
}
}
HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item, EErrorType &error)
{
item.HeaderSize = 0;
bool flagL = false;
bool flagK = false;
AString nameL;
AString nameK;
AString pax;
for (;;)
{
@@ -363,18 +413,11 @@ HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item, EErro
return S_OK;
if (item.PackSize > (1 << 14))
return S_OK;
unsigned packSize = (unsigned)item.GetPackSizeAligned();
char *buf = name->GetBuf(packSize);
size_t processedSize = packSize;
HRESULT res = ReadStream(stream, buf, &processedSize);
item.HeaderSize += (unsigned)processedSize;
name->ReleaseBuf_CalcLen((unsigned)item.PackSize);
RINOK(res);
if (processedSize != packSize)
{
error = k_ErrorType_UnexpectedEnd;
RINOK(ReadDataToString(stream, item, *name, error));
if (error != k_ErrorType_OK)
return S_OK;
}
continue;
}
@@ -385,6 +428,14 @@ HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item, EErro
case 'X':
{
// pax Extended Header
if (item.Name.IsPrefixedBy("PaxHeader/"))
{
RINOK(ReadDataToString(stream, item, pax, error));
if (error != k_ErrorType_OK)
return S_OK;
continue;
}
break;
}
case NFileHeader::NLinkFlag::kDumpDir:
@@ -415,6 +466,16 @@ HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item, EErro
}
error = k_ErrorType_OK;
if (!pax.IsEmpty())
{
AString name;
if (ParsePaxLongName(pax, name))
item.Name = name;
else
error = k_ErrorType_Warning;
}
return S_OK;
}
}

View File

@@ -15,6 +15,7 @@ enum EErrorType
k_ErrorType_OK,
k_ErrorType_Corrupted,
k_ErrorType_UnexpectedEnd,
k_ErrorType_Warning
};
HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &itemInfo, EErrorType &error);