components/p7zip/patches/CVE-2015-1038.patch
author Petr Nyc <Petr.Nyc@Oracle.COM>
Fri, 18 Sep 2015 00:26:21 -0400
branchs11u3-sru
changeset 4874 3c3d9a5b5065
parent 4566 5bc2b7d2ea01
permissions -rw-r--r--
build metadata for S11.3SRU1.2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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