author | Petr Nyc <Petr.Nyc@Oracle.COM> |
Fri, 18 Sep 2015 00:26:21 -0400 | |
branch | s11u3-sru |
changeset 4874 | 3c3d9a5b5065 |
parent 4566 | 5bc2b7d2ea01 |
permissions | -rw-r--r-- |
4566
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
1 |
This patch fixes CVE-2015-1038, filed upstream as |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
2 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
3 |
http://sourceforge.net/p/p7zip/bugs/147/ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
4 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
5 |
The patch contents come from |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
6 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
7 |
http://sourceforge.net/p/p7zip/bugs/_discuss/thread/17901103/2f9c/attachment/CVE-2015-1038.patch |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
8 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
9 |
This will presumably be fixed upstream at some point after 9.38.1. |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
10 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
11 |
====================================================================== |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
12 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
13 |
Author: Ben Hutchings <[email protected]> |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
14 |
Date: Tue, 19 May 2015 02:38:40 +0100 |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
15 |
Description: Delay creation of symlinks to prevent arbitrary file writes (CVE-2015-1038) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
16 |
Bug-Debian: https://bugs.debian.org/774660 |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
17 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
18 |
Alexander Cherepanov discovered that 7zip is susceptible to a |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
19 |
directory traversal vulnerability. While extracting an archive, it |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
20 |
will extract symlinks and then follow them if they are referenced in |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
21 |
further entries. This can be exploited by a rogue archive to write |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
22 |
files outside the current directory. |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
23 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
24 |
We have to create placeholder files (which we already do) and delay |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
25 |
creating symlinks until the end of extraction. |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
26 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
27 |
Due to the possibility of anti-items (deletions) in the archive, it is |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
28 |
possible for placeholders to be deleted and replaced before we create |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
29 |
the symlinks. It's not clear that this can be used for mischief, but |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
30 |
GNU tar guards against similar problems by checking that the placeholder |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
31 |
still exists and is the same inode. XXX It also checks 'birth time' but |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
32 |
this isn't portable. We can probably get away with comparing ctime |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
33 |
since we don't support hard links. |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
34 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
35 |
--- a/CPP/7zip/UI/Agent/Agent.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
36 |
+++ b/CPP/7zip/UI/Agent/Agent.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
37 |
@@ -424,6 +424,8 @@ STDMETHODIMP CAgentFolder::Extract(const |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
38 |
CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
39 |
UStringVector pathParts; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
40 |
CProxyFolder *currentProxyFolder = _proxyFolderItem; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
41 |
+ HRESULT res; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
42 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
43 |
while (currentProxyFolder->Parent) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
44 |
{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
45 |
pathParts.Insert(0, currentProxyFolder->Name); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
46 |
@@ -445,8 +447,11 @@ STDMETHODIMP CAgentFolder::Extract(const |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
47 |
(UInt64)(Int64)-1); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
48 |
CUIntVector realIndices; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
49 |
GetRealIndices(indices, numItems, realIndices); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
50 |
- return _agentSpec->GetArchive()->Extract(&realIndices.Front(), |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
51 |
+ res = _agentSpec->GetArchive()->Extract(&realIndices.Front(), |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
52 |
realIndices.Size(), testMode, extractCallback); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
53 |
+ if (res == S_OK && !extractCallbackSpec->CreateSymLinks()) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
54 |
+ res = E_FAIL; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
55 |
+ return res; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
56 |
COM_TRY_END |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
57 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
58 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
59 |
--- a/CPP/7zip/UI/Agent/ArchiveFolder.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
60 |
+++ b/CPP/7zip/UI/Agent/ArchiveFolder.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
61 |
@@ -20,6 +20,8 @@ STDMETHODIMP CAgentFolder::CopyTo(const |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
62 |
CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
63 |
UStringVector pathParts; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
64 |
CProxyFolder *currentProxyFolder = _proxyFolderItem; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
65 |
+ HRESULT res; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
66 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
67 |
while (currentProxyFolder->Parent) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
68 |
{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
69 |
pathParts.Insert(0, currentProxyFolder->Name); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
70 |
@@ -46,8 +48,11 @@ STDMETHODIMP CAgentFolder::CopyTo(const |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
71 |
(UInt64)(Int64)-1); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
72 |
CUIntVector realIndices; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
73 |
GetRealIndices(indices, numItems, realIndices); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
74 |
- return _agentSpec->GetArchive()->Extract(&realIndices.Front(), |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
75 |
+ res = _agentSpec->GetArchive()->Extract(&realIndices.Front(), |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
76 |
realIndices.Size(), BoolToInt(false), extractCallback); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
77 |
+ if (res == S_OK && !extractCallbackSpec->CreateSymLinks()) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
78 |
+ res = E_FAIL; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
79 |
+ return res; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
80 |
COM_TRY_END |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
81 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
82 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
83 |
--- a/CPP/7zip/UI/Client7z/Client7z.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
84 |
+++ b/CPP/7zip/UI/Client7z/Client7z.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
85 |
@@ -197,8 +197,11 @@ private: |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
86 |
COutFileStream *_outFileStreamSpec; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
87 |
CMyComPtr<ISequentialOutStream> _outFileStream; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
88 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
89 |
+ CObjectVector<NWindows::NFile::NDirectory::CDelayedSymLink> _delayedSymLinks; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
90 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
91 |
public: |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
92 |
void Init(IInArchive *archiveHandler, const UString &directoryPath); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
93 |
+ bool CreateSymLinks(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
94 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
95 |
UInt64 NumErrors; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
96 |
bool PasswordIsDefined; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
97 |
@@ -392,11 +395,22 @@ STDMETHODIMP CArchiveExtractCallback::Se |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
98 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
99 |
_outFileStream.Release(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
100 |
if (_extractMode && _processedFileInfo.AttribDefined) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
101 |
- NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attrib); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
102 |
+ NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attrib, &_delayedSymLinks); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
103 |
PrintNewLine(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
104 |
return S_OK; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
105 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
106 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
107 |
+bool CArchiveExtractCallback::CreateSymLinks() |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
108 |
+{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
109 |
+ bool success = true; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
110 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
111 |
+ for (int i = 0; i != _delayedSymLinks.Size(); ++i) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
112 |
+ success &= _delayedSymLinks[i].Create(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
113 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
114 |
+ _delayedSymLinks.Clear(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
115 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
116 |
+ return success; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
117 |
+} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
118 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
119 |
STDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
120 |
{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
121 |
--- a/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
122 |
+++ b/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
123 |
@@ -453,12 +453,24 @@ STDMETHODIMP CArchiveExtractCallback::Se |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
124 |
NumFiles++; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
125 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
126 |
if (_extractMode && _fi.AttribDefined) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
127 |
- NFile::NDirectory::MySetFileAttributes(_diskFilePath, _fi.Attrib); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
128 |
+ NFile::NDirectory::MySetFileAttributes(_diskFilePath, _fi.Attrib, &_delayedSymLinks); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
129 |
RINOK(_extractCallback2->SetOperationResult(operationResult, _encrypted)); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
130 |
return S_OK; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
131 |
COM_TRY_END |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
132 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
133 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
134 |
+bool CArchiveExtractCallback::CreateSymLinks() |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
135 |
+{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
136 |
+ bool success = true; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
137 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
138 |
+ for (int i = 0; i != _delayedSymLinks.Size(); ++i) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
139 |
+ success &= _delayedSymLinks[i].Create(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
140 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
141 |
+ _delayedSymLinks.Clear(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
142 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
143 |
+ return success; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
144 |
+} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
145 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
146 |
/* |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
147 |
STDMETHODIMP CArchiveExtractCallback::GetInStream( |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
148 |
const wchar_t *name, ISequentialInStream **inStream) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
149 |
--- a/CPP/7zip/UI/Common/ArchiveExtractCallback.h |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
150 |
+++ b/CPP/7zip/UI/Common/ArchiveExtractCallback.h |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
151 |
@@ -6,6 +6,8 @@ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
152 |
#include "Common/MyCom.h" |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
153 |
#include "Common/Wildcard.h" |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
154 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
155 |
+#include "Windows/FileDir.h" |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
156 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
157 |
#include "../../IPassword.h" |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
158 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
159 |
#include "../../Common/FileStreams.h" |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
160 |
@@ -83,6 +85,8 @@ class CArchiveExtractCallback: |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
161 |
UInt64 _packTotal; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
162 |
UInt64 _unpTotal; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
163 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
164 |
+ CObjectVector<NWindows::NFile::NDirectory::CDelayedSymLink> _delayedSymLinks; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
165 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
166 |
void CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
167 |
HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
168 |
HRESULT GetUnpackSize(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
169 |
@@ -138,6 +142,7 @@ public: |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
170 |
const UStringVector &removePathParts, |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
171 |
UInt64 packSize); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
172 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
173 |
+ bool CreateSymLinks(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
174 |
}; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
175 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
176 |
#endif |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
177 |
--- a/CPP/7zip/UI/Common/Extract.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
178 |
+++ b/CPP/7zip/UI/Common/Extract.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
179 |
@@ -96,6 +96,9 @@ static HRESULT DecompressArchive( |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
180 |
else |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
181 |
result = archive->Extract(&realIndices.Front(), realIndices.Size(), testMode, extractCallbackSpec); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
182 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
183 |
+ if (result == S_OK && !extractCallbackSpec->CreateSymLinks()) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
184 |
+ result = E_FAIL; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
185 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
186 |
return callback->ExtractResult(result); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
187 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
188 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
189 |
--- a/CPP/Windows/FileDir.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
190 |
+++ b/CPP/Windows/FileDir.cpp |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
191 |
@@ -453,9 +453,10 @@ bool SetDirTime(LPCWSTR fileName, const |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
192 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
193 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
194 |
#ifndef _UNICODE |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
195 |
-bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
196 |
+bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes, |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
197 |
+ CObjectVector<CDelayedSymLink> *delayedSymLinks) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
198 |
{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
199 |
- return MySetFileAttributes(UnicodeStringToMultiByte(fileName, CP_ACP), fileAttributes); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
200 |
+ return MySetFileAttributes(UnicodeStringToMultiByte(fileName, CP_ACP), fileAttributes, delayedSymLinks); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
201 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
202 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
203 |
bool MyRemoveDirectory(LPCWSTR pathName) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
204 |
@@ -488,7 +489,8 @@ static int convert_to_symlink(const char |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
205 |
return -1; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
206 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
207 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
208 |
-bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
209 |
+bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes, |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
210 |
+ CObjectVector<CDelayedSymLink> *delayedSymLinks) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
211 |
{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
212 |
if (!fileName) { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
213 |
SetLastError(ERROR_PATH_NOT_FOUND); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
214 |
@@ -520,7 +522,9 @@ bool MySetFileAttributes(LPCTSTR fileNam |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
215 |
stat_info.st_mode = fileAttributes >> 16; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
216 |
#ifdef ENV_HAVE_LSTAT |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
217 |
if (S_ISLNK(stat_info.st_mode)) { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
218 |
- if ( convert_to_symlink(name) != 0) { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
219 |
+ if (delayedSymLinks) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
220 |
+ delayedSymLinks->Add(CDelayedSymLink(name)); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
221 |
+ else if ( convert_to_symlink(name) != 0) { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
222 |
TRACEN((printf("MySetFileAttributes(%s,%d) : false-3\n",name,fileAttributes))) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
223 |
return false; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
224 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
225 |
@@ -924,4 +928,41 @@ bool CTempDirectory::Create(LPCTSTR pref |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
226 |
} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
227 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
228 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
229 |
+#ifdef ENV_UNIX |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
230 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
231 |
+CDelayedSymLink::CDelayedSymLink(LPCSTR source) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
232 |
+ : _source(source) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
233 |
+{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
234 |
+ struct stat st; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
235 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
236 |
+ if (lstat(_source, &st) == 0) { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
237 |
+ _dev = st.st_dev; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
238 |
+ _ino = st.st_ino; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
239 |
+ } else { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
240 |
+ _dev = 0; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
241 |
+ } |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
242 |
+} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
243 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
244 |
+bool CDelayedSymLink::Create() |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
245 |
+{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
246 |
+ struct stat st; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
247 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
248 |
+ if (_dev == 0) { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
249 |
+ errno = EPERM; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
250 |
+ return false; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
251 |
+ } |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
252 |
+ if (lstat(_source, &st) != 0) |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
253 |
+ return false; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
254 |
+ if (_dev != st.st_dev || _ino != st.st_ino) { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
255 |
+ // Placeholder file has been overwritten or moved by another |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
256 |
+ // symbolic link creation |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
257 |
+ errno = EPERM; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
258 |
+ return false; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
259 |
+ } |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
260 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
261 |
+ return convert_to_symlink(_source) == 0; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
262 |
+} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
263 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
264 |
+#endif // ENV_UNIX |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
265 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
266 |
}}} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
267 |
--- a/CPP/Windows/FileDir.h |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
268 |
+++ b/CPP/Windows/FileDir.h |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
269 |
@@ -4,6 +4,7 @@ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
270 |
#define __WINDOWS_FILEDIR_H |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
271 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
272 |
#include "../Common/MyString.h" |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
273 |
+#include "../Common/MyVector.h" |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
274 |
#include "Defs.h" |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
275 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
276 |
/* GetFullPathName for 7zAES.cpp */ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
277 |
@@ -13,11 +14,15 @@ namespace NWindows { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
278 |
namespace NFile { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
279 |
namespace NDirectory { |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
280 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
281 |
+class CDelayedSymLink; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
282 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
283 |
bool SetDirTime(LPCWSTR fileName, const FILETIME *creationTime, const FILETIME *lastAccessTime, const FILETIME *lastWriteTime); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
284 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
285 |
-bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
286 |
+bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes, |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
287 |
+ CObjectVector<CDelayedSymLink> *delayedSymLinks = 0); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
288 |
#ifndef _UNICODE |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
289 |
-bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
290 |
+bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes, |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
291 |
+ CObjectVector<CDelayedSymLink> *delayedSymLinks = 0); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
292 |
#endif |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
293 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
294 |
bool MyMoveFile(LPCTSTR existFileName, LPCTSTR newFileName); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
295 |
@@ -80,6 +85,31 @@ public: |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
296 |
bool Remove(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
297 |
}; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
298 |
|
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
299 |
+// Symbolic links must be created last so that they can't be used to |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
300 |
+// create or overwrite files above the extraction directory. |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
301 |
+class CDelayedSymLink |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
302 |
+{ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
303 |
+#ifdef ENV_UNIX |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
304 |
+ // Where the symlink should be created. The target is specified in |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
305 |
+ // the placeholder file. |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
306 |
+ AString _source; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
307 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
308 |
+ // Device and inode of the placeholder file. Before creating the |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
309 |
+ // symlink, we must check that these haven't been changed by creation |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
310 |
+ // of another symlink. |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
311 |
+ dev_t _dev; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
312 |
+ ino_t _ino; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
313 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
314 |
+public: |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
315 |
+ explicit CDelayedSymLink(LPCSTR source); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
316 |
+ bool Create(); |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
317 |
+#else // !ENV_UNIX |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
318 |
+public: |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
319 |
+ CDelayedSymLink(LPCSTR source) {} |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
320 |
+ bool Create() { return true; } |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
321 |
+#endif // ENV_UNIX |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
322 |
+}; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
323 |
+ |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
324 |
#ifdef _UNICODE |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
325 |
typedef CTempFile CTempFileW; |
5bc2b7d2ea01
20318882 problem in UTILITY/P7ZIP
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
326 |
#endif |