diff options
author | Igor Pavlov <ipavlov@users.sourceforge.net> | 2010-09-08 04:00:00 +0400 |
---|---|---|
committer | Kornel LesiĆski <kornel@geekhood.net> | 2016-05-28 02:16:03 +0300 |
commit | 044e4bb7413beb329edfa3ad27b492d819cdc811 (patch) | |
tree | 9da146355814669c1c9331c596edce0acd21c490 /CPP/7zip/Archive/Tar | |
parent | e279500d76f1944ba26526f085030909a2c7ef49 (diff) |
9.169.16
Diffstat (limited to 'CPP/7zip/Archive/Tar')
-rwxr-xr-x | CPP/7zip/Archive/Tar/TarHandlerOut.cpp | 3 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Tar/TarIn.cpp | 13 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Tar/TarOut.cpp | 27 |
3 files changed, 29 insertions, 14 deletions
diff --git a/CPP/7zip/Archive/Tar/TarHandlerOut.cpp b/CPP/7zip/Archive/Tar/TarHandlerOut.cpp index 92b8abdc..a999f838 100755 --- a/CPP/7zip/Archive/Tar/TarHandlerOut.cpp +++ b/CPP/7zip/Archive/Tar/TarHandlerOut.cpp @@ -107,8 +107,11 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt if (prop.vt != VT_UI8) return E_INVALIDARG; ui.Size = prop.uhVal.QuadPart; + /* + // now we support GNU extension for big files if (ui.Size >= ((UInt64)1 << 33)) return E_INVALIDARG; + */ } updateItems.Add(ui); } diff --git a/CPP/7zip/Archive/Tar/TarIn.cpp b/CPP/7zip/Archive/Tar/TarIn.cpp index 939c6c0a..c9c3c422 100755 --- a/CPP/7zip/Archive/Tar/TarIn.cpp +++ b/CPP/7zip/Archive/Tar/TarIn.cpp @@ -2,6 +2,8 @@ #include "StdAfx.h" +#include "../../../../C/CpuArch.h" + #include "Common/StringToInt.h" #include "../../Common/StreamUtils.h" @@ -92,7 +94,16 @@ static HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemE if (!OctalToNumber32(p, 8, item.UID)) item.UID = 0; p += 8; if (!OctalToNumber32(p, 8, item.GID)) item.GID = 0; p += 8; - RIF(OctalToNumber(p, 12, item.Size)); p += 12; + if (GetBe32(p) == (UInt32)1 << 31) + { + // GNU extension + item.Size = GetBe64(p + 4); + } + else + { + RIF(OctalToNumber(p, 12, item.Size)); + } + p += 12; RIF(OctalToNumber32(p, 12, item.MTime)); p += 12; UInt32 checkSum; diff --git a/CPP/7zip/Archive/Tar/TarOut.cpp b/CPP/7zip/Archive/Tar/TarOut.cpp index 1ec314c7..e542a3b2 100755 --- a/CPP/7zip/Archive/Tar/TarOut.cpp +++ b/CPP/7zip/Archive/Tar/TarOut.cpp @@ -53,17 +53,23 @@ static bool MakeOctalString8(char *s, UInt32 value) return true; } -static bool MakeOctalString12(char *s, UInt64 value) +static void MakeOctalString12(char *s, UInt64 value) { AString tempString = MakeOctalString(value); const int kMaxSize = 12; if (tempString.Length() > kMaxSize) - return false; + { + // GNU extension; + s[0] = (char)(Byte)0x80; + s[1] = s[2] = s[3] = 0; + for (int i = 0; i < 8; i++, value <<= 8) + s[4 + i] = (char)(value >> 56); + return; + } int numSpaces = kMaxSize - tempString.Length(); for(int i = 0; i < numSpaces; i++) s[i] = ' '; memmove(s + numSpaces, (const char *)tempString, tempString.Length()); - return true; } static bool CopyString(char *dest, const AString &src, int maxSize) @@ -90,17 +96,12 @@ HRESULT COutArchive::WriteHeaderReal(const CItem &item) MyStrNCpy(cur, item.Name, NFileHeader::kNameSize); cur += NFileHeader::kNameSize; - RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.Mode)); - cur += 8; - RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.UID)); - cur += 8; - RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.GID)); - cur += 8; + RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.Mode)); cur += 8; + RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.UID)); cur += 8; + RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.GID)); cur += 8; - RETURN_IF_NOT_TRUE(MakeOctalString12(cur, item.Size)); - cur += 12; - RETURN_IF_NOT_TRUE(MakeOctalString12(cur, item.MTime)); - cur += 12; + MakeOctalString12(cur, item.Size); cur += 12; + MakeOctalString12(cur, item.MTime); cur += 12; memmove(cur, NFileHeader::kCheckSumBlanks, 8); cur += 8; |