diff options
Diffstat (limited to 'CPP/7zip/Archive/Tar')
-rwxr-xr-x | CPP/7zip/Archive/Tar/TarHeader.h | 9 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Tar/TarIn.cpp | 23 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Tar/TarIn.h | 2 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Tar/TarItem.h | 16 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Tar/TarOut.cpp | 6 |
5 files changed, 36 insertions, 20 deletions
diff --git a/CPP/7zip/Archive/Tar/TarHeader.h b/CPP/7zip/Archive/Tar/TarHeader.h index 0ab31e52..19bb1cac 100755 --- a/CPP/7zip/Archive/Tar/TarHeader.h +++ b/CPP/7zip/Archive/Tar/TarHeader.h @@ -75,6 +75,15 @@ namespace NFileHeader const char kDirectory = '5'; // Directory const char kFIFO = '6'; // FIFO special file const char kContiguous = '7'; // Contiguous file + + const char kDumpDir = 'D'; /* GNUTYPE_DUMPDIR. + data: list of files created by the --incremental (-G) option + Each file name is preceded by either + - 'Y' (file should be in this archive) + - 'N' (file is a directory, or is not stored in the archive.) + Each file name is terminated by a null + an additional null after + the last file name. */ + } // Further link types may be defined later. diff --git a/CPP/7zip/Archive/Tar/TarIn.cpp b/CPP/7zip/Archive/Tar/TarIn.cpp index bae1db86..1318613a 100755 --- a/CPP/7zip/Archive/Tar/TarIn.cpp +++ b/CPP/7zip/Archive/Tar/TarIn.cpp @@ -13,9 +13,10 @@ namespace NArchive { namespace NTar { -HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 &processedSize) +HRESULT CInArchive::ReadBytes(void *data, size_t size, size_t &processedSize) { - RINOK(ReadStream(m_Stream, data, size, &processedSize)); + processedSize = size; + RINOK(ReadStream(m_Stream, data, &processedSize)); m_Position += processedSize; return S_OK; } @@ -93,7 +94,7 @@ HRESULT CInArchive::GetNextItemReal(bool &filled, CItemEx &item) filled = false; - UInt32 processedSize; + size_t processedSize; item.HeaderPosition = m_Position; RINOK(ReadBytes(record, NFileHeader::kRecordSize, processedSize)); if (processedSize == 0 || @@ -174,7 +175,8 @@ HRESULT CInArchive::GetNextItemReal(bool &filled, CItemEx &item) AString prefix; ReadString(cur, NFileHeader::kPrefixSize, prefix); cur += NFileHeader::kPrefixSize; - if (!prefix.IsEmpty() && item.IsMagic()) + if (!prefix.IsEmpty() && item.IsMagic() && + (item.LinkFlag != 'L' /* || prefix != "00000000000" */ )) item.Name = prefix + AString('/') + item.Name; if (item.LinkFlag == NFileHeader::NLinkFlag::kLink) @@ -205,10 +207,12 @@ HRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item) return S_FALSE; UInt64 headerPosition = item.HeaderPosition; - UInt32 processedSize; + size_t processedSize; AString fullName; - char *buffer = fullName.GetBuffer((UInt32)item.Size + 1); - RINOK(ReadBytes(buffer, (UInt32)item.Size, processedSize)); + if (item.Size > (1 << 15)) + return S_FALSE; + char *buffer = fullName.GetBuffer((int)item.Size + 1); + RINOK(ReadBytes(buffer, (size_t)item.Size, processedSize)); buffer[item.Size] = '\0'; fullName.ReleaseBuffer(); if (processedSize != item.Size) @@ -224,6 +228,11 @@ HRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item) // pax Extended Header return S_OK; } + else if (item.LinkFlag == NFileHeader::NLinkFlag::kDumpDir) + { + // GNU Extensions to the Archive Format + return S_OK; + } else if (item.LinkFlag > '7' || (item.LinkFlag < '0' && item.LinkFlag != 0)) return S_FALSE; return S_OK; diff --git a/CPP/7zip/Archive/Tar/TarIn.h b/CPP/7zip/Archive/Tar/TarIn.h index 28781375..20c030ef 100755 --- a/CPP/7zip/Archive/Tar/TarIn.h +++ b/CPP/7zip/Archive/Tar/TarIn.h @@ -16,7 +16,7 @@ class CInArchive CMyComPtr<IInStream> m_Stream; UInt64 m_Position; - HRESULT ReadBytes(void *data, UInt32 size, UInt32 &processedSize); + HRESULT ReadBytes(void *data, size_t size, size_t &processedSize); public: HRESULT Open(IInStream *inStream); HRESULT GetNextItemReal(bool &filled, CItemEx &itemInfo); diff --git a/CPP/7zip/Archive/Tar/TarItem.h b/CPP/7zip/Archive/Tar/TarItem.h index 10b57cd0..451d74bc 100755 --- a/CPP/7zip/Archive/Tar/TarItem.h +++ b/CPP/7zip/Archive/Tar/TarItem.h @@ -35,16 +35,18 @@ public: UInt32 DeviceMinor; bool IsDirectory() const - { - if (LinkFlag == NFileHeader::NLinkFlag::kDirectory) + { + switch(LinkFlag) + { + case NFileHeader::NLinkFlag::kDirectory: + case NFileHeader::NLinkFlag::kDumpDir: return true; - if (LinkFlag == NFileHeader::NLinkFlag::kOldNormal || - LinkFlag == NFileHeader::NLinkFlag::kNormal) - { + case NFileHeader::NLinkFlag::kOldNormal: + case NFileHeader::NLinkFlag::kNormal: return NItemName::HasTailSlash(Name, CP_OEMCP); - } - return false; } + return false; + } bool IsMagic() const { diff --git a/CPP/7zip/Archive/Tar/TarOut.cpp b/CPP/7zip/Archive/Tar/TarOut.cpp index e278edda..a697b4d2 100755 --- a/CPP/7zip/Archive/Tar/TarOut.cpp +++ b/CPP/7zip/Archive/Tar/TarOut.cpp @@ -14,11 +14,7 @@ namespace NTar { HRESULT COutArchive::WriteBytes(const void *buffer, UInt32 size) { - UInt32 processedSize; - RINOK(WriteStream(m_Stream, buffer, size, &processedSize)); - if(processedSize != size) - return E_FAIL; - return S_OK; + return WriteStream(m_Stream, buffer, size); } void COutArchive::Create(ISequentialOutStream *outStream) |