7zIn.cpp (p7zip_15.14.1_src_all) | : | 7zIn.cpp (p7zip_16.02_src_all) | ||
---|---|---|---|---|
skipping to change at line 96 | skipping to change at line 96 | |||
{ | { | |||
Set(archive, byteBuffer, byteBuffer.Size(), false); | Set(archive, byteBuffer, byteBuffer.Size(), false); | |||
} | } | |||
void CStreamSwitch::Set(CInArchive *archive, const CObjectVector<CByteBuffer> *d ataVector) | void CStreamSwitch::Set(CInArchive *archive, const CObjectVector<CByteBuffer> *d ataVector) | |||
{ | { | |||
Remove(); | Remove(); | |||
Byte external = archive->ReadByte(); | Byte external = archive->ReadByte(); | |||
if (external != 0) | if (external != 0) | |||
{ | { | |||
if (!dataVector) | ||||
ThrowIncorrect(); | ||||
CNum dataIndex = archive->ReadNum(); | CNum dataIndex = archive->ReadNum(); | |||
if (dataIndex >= dataVector->Size()) | if (dataIndex >= dataVector->Size()) | |||
ThrowIncorrect(); | ThrowIncorrect(); | |||
Set(archive, (*dataVector)[dataIndex]); | Set(archive, (*dataVector)[dataIndex]); | |||
} | } | |||
} | } | |||
void CInArchive::AddByteStream(const Byte *buf, size_t size) | void CInArchive::AddByteStream(const Byte *buf, size_t size) | |||
{ | { | |||
if (_numInByteBufs == kNumBufLevelsMax) | if (_numInByteBufs == kNumBufLevelsMax) | |||
skipping to change at line 762 | skipping to change at line 764 | |||
break; | break; | |||
} | } | |||
if (i == numCoders) | if (i == numCoders) | |||
ThrowUnsupported(); | ThrowUnsupported(); | |||
} | } | |||
folders.FoToCoderUnpackSizes[fo] = numCodersOutStreams; | folders.FoToCoderUnpackSizes[fo] = numCodersOutStreams; | |||
numCodersOutStreams += numCoders; | numCodersOutStreams += numCoders; | |||
folders.FoStartPackStreamIndex[fo] = packStreamIndex; | folders.FoStartPackStreamIndex[fo] = packStreamIndex; | |||
if (numPackStreams > folders.NumPackStreams - packStreamIndex) | ||||
ThrowIncorrect(); | ||||
packStreamIndex += numPackStreams; | packStreamIndex += numPackStreams; | |||
folders.FoToMainUnpackSizeIndex[fo] = (Byte)indexOfMainStream; | folders.FoToMainUnpackSizeIndex[fo] = (Byte)indexOfMainStream; | |||
} | } | |||
size_t dataSize = _inByteBack->GetPtr() - startBufPtr; | size_t dataSize = _inByteBack->GetPtr() - startBufPtr; | |||
folders.FoToCoderUnpackSizes[fo] = numCodersOutStreams; | folders.FoToCoderUnpackSizes[fo] = numCodersOutStreams; | |||
folders.FoStartPackStreamIndex[fo] = packStreamIndex; | folders.FoStartPackStreamIndex[fo] = packStreamIndex; | |||
folders.FoCodersDataOffset[fo] = _inByteBack->GetPtr() - startBufPtr; | folders.FoCodersDataOffset[fo] = _inByteBack->GetPtr() - startBufPtr; | |||
folders.CodersData.CopyFrom(startBufPtr, dataSize); | folders.CodersData.CopyFrom(startBufPtr, dataSize); | |||
// if (folders.NumPackStreams != packStreamIndex) ThrowUnsupported(); | ||||
} | } | |||
WaitId(NID::kCodersUnpackSize); | WaitId(NID::kCodersUnpackSize); | |||
folders.CoderUnpackSizes.Alloc(numCodersOutStreams); | folders.CoderUnpackSizes.Alloc(numCodersOutStreams); | |||
for (CNum i = 0; i < numCodersOutStreams; i++) | for (CNum i = 0; i < numCodersOutStreams; i++) | |||
folders.CoderUnpackSizes[i] = ReadNumber(); | folders.CoderUnpackSizes[i] = ReadNumber(); | |||
for (;;) | for (;;) | |||
{ | { | |||
UInt64 type = ReadID(); | UInt64 type = ReadID(); | |||
skipping to change at line 1145 | skipping to change at line 1151 | |||
digests); | digests); | |||
db.ArcInfo.DataStartPosition += db.ArcInfo.StartPositionAfterHeader; | db.ArcInfo.DataStartPosition += db.ArcInfo.StartPositionAfterHeader; | |||
type = ReadID(); | type = ReadID(); | |||
} | } | |||
db.Files.Clear(); | db.Files.Clear(); | |||
if (type == NID::kFilesInfo) | if (type == NID::kFilesInfo) | |||
{ | { | |||
CNum numFiles = ReadNum(); | const CNum numFiles = ReadNum(); | |||
db.Files.ClearAndSetSize(numFiles); | db.Files.ClearAndSetSize(numFiles); | |||
CNum i; | ||||
/* | /* | |||
db.Files.Reserve(numFiles); | db.Files.Reserve(numFiles); | |||
CNum i; | CNum i; | |||
for (i = 0; i < numFiles; i++) | for (i = 0; i < numFiles; i++) | |||
db.Files.Add(CFileItem()); | db.Files.Add(CFileItem()); | |||
*/ | */ | |||
db.ArcInfo.FileInfoPopIDs.Add(NID::kSize); | db.ArcInfo.FileInfoPopIDs.Add(NID::kSize); | |||
// if (!db.PackSizes.IsEmpty()) | // if (!db.PackSizes.IsEmpty()) | |||
db.ArcInfo.FileInfoPopIDs.Add(NID::kPackInfo); | db.ArcInfo.FileInfoPopIDs.Add(NID::kPackInfo); | |||
skipping to change at line 1169 | skipping to change at line 1174 | |||
db.ArcInfo.FileInfoPopIDs.Add(NID::kCRC); | db.ArcInfo.FileInfoPopIDs.Add(NID::kCRC); | |||
CBoolVector emptyStreamVector; | CBoolVector emptyStreamVector; | |||
BoolVector_Fill_False(emptyStreamVector, (unsigned)numFiles); | BoolVector_Fill_False(emptyStreamVector, (unsigned)numFiles); | |||
CBoolVector emptyFileVector; | CBoolVector emptyFileVector; | |||
CBoolVector antiFileVector; | CBoolVector antiFileVector; | |||
CNum numEmptyStreams = 0; | CNum numEmptyStreams = 0; | |||
for (;;) | for (;;) | |||
{ | { | |||
UInt64 type = ReadID(); | const UInt64 type2 = ReadID(); | |||
if (type == NID::kEnd) | if (type2 == NID::kEnd) | |||
break; | break; | |||
UInt64 size = ReadNumber(); | UInt64 size = ReadNumber(); | |||
if (size > _inByteBack->GetRem()) | if (size > _inByteBack->GetRem()) | |||
ThrowIncorrect(); | ThrowIncorrect(); | |||
CStreamSwitch switchProp; | CStreamSwitch switchProp; | |||
switchProp.Set(this, _inByteBack->GetPtr(), (size_t)size, true); | switchProp.Set(this, _inByteBack->GetPtr(), (size_t)size, true); | |||
bool addPropIdToList = true; | bool addPropIdToList = true; | |||
bool isKnownType = true; | bool isKnownType = true; | |||
if (type > ((UInt32)1 << 30)) | if (type2 > ((UInt32)1 << 30)) | |||
isKnownType = false; | isKnownType = false; | |||
else switch ((UInt32)type) | else switch ((UInt32)type2) | |||
{ | { | |||
case NID::kName: | case NID::kName: | |||
{ | { | |||
CStreamSwitch streamSwitch; | CStreamSwitch streamSwitch; | |||
streamSwitch.Set(this, &dataVector); | streamSwitch.Set(this, &dataVector); | |||
size_t rem = _inByteBack->GetRem(); | size_t rem = _inByteBack->GetRem(); | |||
db.NamesBuf.Alloc(rem); | db.NamesBuf.Alloc(rem); | |||
ReadBytes(db.NamesBuf, rem); | ReadBytes(db.NamesBuf, rem); | |||
db.NameOffsets.Alloc(db.Files.Size() + 1); | db.NameOffsets.Alloc(db.Files.Size() + 1); | |||
size_t pos = 0; | size_t pos = 0; | |||
skipping to change at line 1215 | skipping to change at line 1220 | |||
if (pos != rem) | if (pos != rem) | |||
ThereIsHeaderError = true; | ThereIsHeaderError = true; | |||
break; | break; | |||
} | } | |||
case NID::kWinAttrib: | case NID::kWinAttrib: | |||
{ | { | |||
CBoolVector boolVector; | CBoolVector boolVector; | |||
ReadBoolVector2(db.Files.Size(), boolVector); | ReadBoolVector2(db.Files.Size(), boolVector); | |||
CStreamSwitch streamSwitch; | CStreamSwitch streamSwitch; | |||
streamSwitch.Set(this, &dataVector); | streamSwitch.Set(this, &dataVector); | |||
for (i = 0; i < numFiles; i++) | for (CNum i = 0; i < numFiles; i++) | |||
{ | { | |||
CFileItem &file = db.Files[i]; | CFileItem &file = db.Files[i]; | |||
file.AttribDefined = boolVector[i]; | file.AttribDefined = boolVector[i]; | |||
if (file.AttribDefined) | if (file.AttribDefined) | |||
file.Attrib = ReadUInt32(); | file.Attrib = ReadUInt32(); | |||
} | } | |||
break; | break; | |||
} | } | |||
/* | /* | |||
case NID::kIsAux: | case NID::kIsAux: | |||
skipping to change at line 1258 | skipping to change at line 1263 | |||
if (file.IsAltStream) | if (file.IsAltStream) | |||
db.ThereAreAltStreams = true; | db.ThereAreAltStreams = true; | |||
} | } | |||
break; | break; | |||
} | } | |||
*/ | */ | |||
case NID::kEmptyStream: | case NID::kEmptyStream: | |||
{ | { | |||
ReadBoolVector(numFiles, emptyStreamVector); | ReadBoolVector(numFiles, emptyStreamVector); | |||
numEmptyStreams = 0; | numEmptyStreams = 0; | |||
for (i = 0; i < (CNum)emptyStreamVector.Size(); i++) | for (CNum i = 0; i < (CNum)emptyStreamVector.Size(); i++) | |||
if (emptyStreamVector[i]) | if (emptyStreamVector[i]) | |||
numEmptyStreams++; | numEmptyStreams++; | |||
BoolVector_Fill_False(emptyFileVector, numEmptyStreams); | BoolVector_Fill_False(emptyFileVector, numEmptyStreams); | |||
BoolVector_Fill_False(antiFileVector, numEmptyStreams); | BoolVector_Fill_False(antiFileVector, numEmptyStreams); | |||
break; | break; | |||
} | } | |||
case NID::kEmptyFile: ReadBoolVector(numEmptyStreams, emptyFileVector); b reak; | case NID::kEmptyFile: ReadBoolVector(numEmptyStreams, emptyFileVector); b reak; | |||
case NID::kAnti: ReadBoolVector(numEmptyStreams, antiFileVector); break; | case NID::kAnti: ReadBoolVector(numEmptyStreams, antiFileVector); break; | |||
skipping to change at line 1332 | skipping to change at line 1337 | |||
} | } | |||
break; | break; | |||
} | } | |||
*/ | */ | |||
default: | default: | |||
addPropIdToList = isKnownType = false; | addPropIdToList = isKnownType = false; | |||
} | } | |||
if (isKnownType) | if (isKnownType) | |||
{ | { | |||
if (addPropIdToList) | if (addPropIdToList) | |||
db.ArcInfo.FileInfoPopIDs.Add(type); | db.ArcInfo.FileInfoPopIDs.Add(type2); | |||
} | } | |||
else | else | |||
{ | { | |||
db.UnsupportedFeatureWarning = true; | db.UnsupportedFeatureWarning = true; | |||
_inByteBack->SkipRem(); | _inByteBack->SkipRem(); | |||
} | } | |||
// SkipData worked incorrectly in some versions before v4.59 (7zVer <= 0.02) | // SkipData worked incorrectly in some versions before v4.59 (7zVer <= 0.02) | |||
if (_inByteBack->GetRem() != 0) | if (_inByteBack->GetRem() != 0) | |||
ThrowIncorrect(); | ThrowIncorrect(); | |||
} | } | |||
type = ReadID(); // Read (NID::kEnd) end of headers | type = ReadID(); // Read (NID::kEnd) end of headers | |||
if (numFiles - numEmptyStreams != unpackSizes.Size()) | if (numFiles - numEmptyStreams != unpackSizes.Size()) | |||
ThrowUnsupported(); | ThrowUnsupported(); | |||
CNum emptyFileIndex = 0; | CNum emptyFileIndex = 0; | |||
CNum sizeIndex = 0; | CNum sizeIndex = 0; | |||
CNum numAntiItems = 0; | CNum numAntiItems = 0; | |||
CNum i; | ||||
for (i = 0; i < numEmptyStreams; i++) | for (i = 0; i < numEmptyStreams; i++) | |||
if (antiFileVector[i]) | if (antiFileVector[i]) | |||
numAntiItems++; | numAntiItems++; | |||
for (i = 0; i < numFiles; i++) | for (i = 0; i < numFiles; i++) | |||
{ | { | |||
CFileItem &file = db.Files[i]; | CFileItem &file = db.Files[i]; | |||
bool isAnti; | bool isAnti; | |||
file.HasStream = !emptyStreamVector[i]; | file.HasStream = !emptyStreamVector[i]; | |||
file.Crc = 0; | file.Crc = 0; | |||
End of changes. 12 change blocks. | ||||
9 lines changed or deleted | 17 lines changed or added |