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

@@ -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;
}
}