Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Pavlov <ipavlov@users.sourceforge.net>2010-06-20 04:00:00 +0400
committerKornel LesiƄski <kornel@geekhood.net>2016-05-28 02:16:03 +0300
commite279500d76f1944ba26526f085030909a2c7ef49 (patch)
tree130291a48634b2918c6749be8ea360d15e1e202b /CPP/7zip/Archive/Wim
parent708873490ee36691d84cc06336aac87c5129f8a0 (diff)
9.159.15
Diffstat (limited to 'CPP/7zip/Archive/Wim')
-rwxr-xr-xCPP/7zip/Archive/Wim/WimHandler.cpp5
-rwxr-xr-xCPP/7zip/Archive/Wim/WimHandlerOut.cpp10
-rwxr-xr-xCPP/7zip/Archive/Wim/WimIn.cpp7
3 files changed, 13 insertions, 9 deletions
diff --git a/CPP/7zip/Archive/Wim/WimHandler.cpp b/CPP/7zip/Archive/Wim/WimHandler.cpp
index 8092a34c..9bea60dd 100755
--- a/CPP/7zip/Archive/Wim/WimHandler.cpp
+++ b/CPP/7zip/Archive/Wim/WimHandler.cpp
@@ -391,7 +391,6 @@ STDMETHODIMP CHandler::Open(IInStream *inStream,
{
COM_TRY_BEGIN
Close();
- try
{
CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
@@ -488,10 +487,6 @@ STDMETHODIMP CHandler::Open(IInStream *inStream,
_xmlInComments = (_xmls.Size() == 1 && !_db.ShowImageNumber);
}
- catch(...)
- {
- return S_FALSE;
- }
return S_OK;
COM_TRY_END
}
diff --git a/CPP/7zip/Archive/Wim/WimHandlerOut.cpp b/CPP/7zip/Archive/Wim/WimHandlerOut.cpp
index d51eb81a..c7eb9980 100755
--- a/CPP/7zip/Archive/Wim/WimHandlerOut.cpp
+++ b/CPP/7zip/Archive/Wim/WimHandlerOut.cpp
@@ -258,7 +258,7 @@ static size_t WriteItem(const CUpdateItem &item, Byte *p, const Byte *hash)
return totalLen;
}
-void WriteTree(const CDir &tree, CRecordVector<CSha1Hash> &digests,
+static void WriteTree(const CDir &tree, CRecordVector<CSha1Hash> &digests,
CUpdateItem &defaultDirItem,
CObjectVector<CUpdateItem> &updateItems, Byte *dest, size_t &pos)
{
@@ -488,11 +488,15 @@ static HRESULT UpdateArchive(ISequentialOutStream *seqOutStream,
const UInt32 kSecuritySize = 8;
size_t pos = kSecuritySize;
WriteTree(rootFolder, hashes.Digests, ri, updateItems, NULL, pos);
+
CByteBuffer meta;
meta.SetCapacity(pos);
- // memset(meta, 0, kSecuritySize);
- Set32((Byte *)meta, 0); // only if there is no security data, we can use 0 here.
+
+ // we can write 0 here only if there is no security data, imageX does it,
+ // but some programs expect size = 8
+ Set32((Byte *)meta, 8); // size of security data
Set32((Byte *)meta + 4, 0); // num security entries
+
pos = kSecuritySize;
WriteTree(rootFolder, hashes.Digests, ri, updateItems, (Byte *)meta, pos);
diff --git a/CPP/7zip/Archive/Wim/WimIn.cpp b/CPP/7zip/Archive/Wim/WimIn.cpp
index b65b4c44..4ea028af 100755
--- a/CPP/7zip/Archive/Wim/WimIn.cpp
+++ b/CPP/7zip/Archive/Wim/WimIn.cpp
@@ -384,7 +384,12 @@ HRESULT CDatabase::ParseDirItem(size_t pos, int parent)
return S_FALSE;
UInt32 fileNameLen = Get16(p + 0x24);
- if ((fileNameLen & 1) != 0 || ((0x26 + fileNameLen + 6) & ~7) != len)
+ if ((fileNameLen & 1) != 0)
+ return S_FALSE;
+ /* Probably different versions of ImageX can use different number of
+ additional ZEROs. So we don't use exact check. */
+ UInt32 fileNameLen2 = (fileNameLen == 0 ? fileNameLen : fileNameLen + 2);
+ if (((0x26 + fileNameLen2 + 6) & ~7) > len)
return S_FALSE;
UString name;