diff options
author | 2015-08-08 13:49:04 -0700 | |
---|---|---|
committer | 2015-08-08 17:38:18 -0700 | |
commit | 56bd759df1d0c750a065b8c845e93d5dfa6b549d (patch) | |
tree | 3f91093cdb475e565ae857f1c5a7fd339e2d781e /app-arch/p7zip | |
download | gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.gz gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.bz2 gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.zip |
proj/gentoo: Initial commit
This commit represents a new era for Gentoo:
Storing the gentoo-x86 tree in Git, as converted from CVS.
This commit is the start of the NEW history.
Any historical data is intended to be grafted onto this point.
Creation process:
1. Take final CVS checkout snapshot
2. Remove ALL ChangeLog* files
3. Transform all Manifests to thin
4. Remove empty Manifests
5. Convert all stale $Header$/$Id$ CVS keywords to non-expanded Git $Id$
5.1. Do not touch files with -kb/-ko keyword flags.
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
X-Thanks: Alec Warner <antarus@gentoo.org> - did the GSoC 2006 migration tests
X-Thanks: Robin H. Johnson <robbat2@gentoo.org> - infra guy, herding this project
X-Thanks: Nguyen Thai Ngoc Duy <pclouds@gentoo.org> - Former Gentoo developer, wrote Git features for the migration
X-Thanks: Brian Harring <ferringb@gentoo.org> - wrote much python to improve cvs2svn
X-Thanks: Rich Freeman <rich0@gentoo.org> - validation scripts
X-Thanks: Patrick Lauer <patrick@gentoo.org> - Gentoo dev, running new 2014 work in migration
X-Thanks: Michał Górny <mgorny@gentoo.org> - scripts, QA, nagging
X-Thanks: All of other Gentoo developers - many ideas and lots of paint on the bikeshed
Diffstat (limited to 'app-arch/p7zip')
-rw-r--r-- | app-arch/p7zip/Manifest | 2 | ||||
-rw-r--r-- | app-arch/p7zip/files/9.04-makefile.patch | 19 | ||||
-rw-r--r-- | app-arch/p7zip/files/p7zip | 73 | ||||
-rw-r--r-- | app-arch/p7zip/files/p7zip-9.20.1-CVE-2015-1038.patch | 315 | ||||
-rw-r--r-- | app-arch/p7zip/files/p7zip-9.20.1-QA.patch | 17 | ||||
-rw-r--r-- | app-arch/p7zip/files/p7zip-9.20.1-execstack.patch | 24 | ||||
-rw-r--r-- | app-arch/p7zip/files/p7zip-9.20.1-long_rar_pwd.patch | 17 | ||||
-rw-r--r-- | app-arch/p7zip/files/p7zip-9.38.1-CVE-2015-1038.patch | 283 | ||||
-rw-r--r-- | app-arch/p7zip/files/p7zip-9.38.1-osversion.patch | 28 | ||||
-rw-r--r-- | app-arch/p7zip/metadata.xml | 14 | ||||
-rw-r--r-- | app-arch/p7zip/p7zip-9.20.1-r5.ebuild | 155 | ||||
-rw-r--r-- | app-arch/p7zip/p7zip-9.38.1-r2.ebuild | 156 |
12 files changed, 1103 insertions, 0 deletions
diff --git a/app-arch/p7zip/Manifest b/app-arch/p7zip/Manifest new file mode 100644 index 000000000000..44c4c6179ae4 --- /dev/null +++ b/app-arch/p7zip/Manifest @@ -0,0 +1,2 @@ +DIST p7zip_9.20.1_src_all.tar.bz2 3835235 SHA256 49557e7ffca08100f9fc687f4dfc5aea703ca207640c76d9dee7b66f03cb4782 SHA512 7bb8a276aaefc4a83364e45633c48527de44c6b1205344f3356db570582f30f81d82a94938c99a7ad193587b584cc1c03219c28249de40018bdaee6c3b2a022a WHIRLPOOL cb20f37d3f796931a9b330728aa7148afe98bbf8a49bb91bfd80e4667c16416206b23bf34298e9ec37825e8b43f92a5710f0cea1f974296d5c17aa2c7b0931f3 +DIST p7zip_9.38.1_src_all.tar.bz2 3917925 SHA256 fd5019109c9a1bf34ad3257d37a6853eae8151ff50345f0a3ffba7d8c5fdb995 SHA512 f524ffae54e0d9563a509cc4b243e830d882a925e682eb2e15e2d19cb72c947fddecd72c8507d6c1538b997b240b0827046fc2fb4f5e3f7d49840257c92b9c04 WHIRLPOOL 6bad1cde056ab1e8db4079c0e649665fbc7e6b9a565261188bd0acaec6c583d8bd9425cb26d39315408d0180ba0be0069a77b704633cf05ec855220cb31f1c24 diff --git a/app-arch/p7zip/files/9.04-makefile.patch b/app-arch/p7zip/files/9.04-makefile.patch new file mode 100644 index 000000000000..93a99cc9014f --- /dev/null +++ b/app-arch/p7zip/files/9.04-makefile.patch @@ -0,0 +1,19 @@ +--- p7zip_9.04/CPP/7zip/Bundles/Format7zFree/makefile.orig 2010-01-04 13:58:54.527887746 +0100 ++++ p7zip_9.04/CPP/7zip/Bundles/Format7zFree/makefile 2010-01-04 13:59:10.290868343 +0100 +@@ -247,8 +247,6 @@ + MyAes.o \ + Pbkdf2HmacSha1.o \ + RandGen.o \ +- Rar20Crypto.o \ +- RarAes.o \ + Sha1.o \ + WzAes.o \ + ZipCrypto.o \ +@@ -298,7 +296,6 @@ + $(HFS_OBJS) \ + $(ISO_OBJS) \ + $(NSIS_OBJS) \ +- $(RAR_OBJS) \ + $(TAR_OBJS) \ + $(UDF_OBJS) \ + $(WIM_OBJS) \ diff --git a/app-arch/p7zip/files/p7zip b/app-arch/p7zip/files/p7zip new file mode 100644 index 000000000000..9aaf078cbe00 --- /dev/null +++ b/app-arch/p7zip/files/p7zip @@ -0,0 +1,73 @@ +#!/bin/bash +# gzip-like CLI wrapper for p7zip +set -e + +compress=true +file= + +usage () + { + echo "Usage: $0 [-d] [-h|--help] [file]" + exit 1 + } + +while [ "$#" != "0" ] ; do + case "$1" in + -d) compress=false ;; + -c) echo "$0: ignoring $1 option (not yet implemented)" ;; + -h|--help) usage ;; + *) + if [ "${file}" = "" ] ; then + file="$1" + else + usage + fi + ;; + esac + shift +done + +# make sure they're present, before we screw up +for i in mktemp 7z rm cat tty ; do + if ! which $i > /dev/null ; then + echo "$0: $i: command not found" + exit 1 + fi +done + +if [ "${file}" != "" ] ; then + if ${compress} ; then + 7z a ${file}.7z ${file} + rm ${file} + else + case ${file} in + *.7z) + 7z x ${file} + rm ${file} + ;; + *) + echo "$0: ${file}: unknown suffix -- ignored" + ;; + esac + fi + exit 0 +fi + +tmp=`mktemp` +trap "rm -f ${tmp}" 0 + +if ${compress} ; then + if tty > /dev/null ; then + echo "$0: compressed data not written to a terminal." + echo "For help, type: $0 -h" + exit 1 + fi + rm -f ${tmp} + 7z a ${tmp} -si >/dev/null + cat ${tmp} +else + cat > ${tmp} + 7z x ${tmp} -so 2>/dev/null | cat +fi + +rm -f ${tmp} diff --git a/app-arch/p7zip/files/p7zip-9.20.1-CVE-2015-1038.patch b/app-arch/p7zip/files/p7zip-9.20.1-CVE-2015-1038.patch new file mode 100644 index 000000000000..09dd0f29cce7 --- /dev/null +++ b/app-arch/p7zip/files/p7zip-9.20.1-CVE-2015-1038.patch @@ -0,0 +1,315 @@ +Author: Ben Hutchings <ben@decadent.org.uk> +Date: Tue, 19 May 2015 02:38:40 +0100 +Description: Delay creation of symlinks to prevent arbitrary file writes (CVE-2015-1038) +Bug: http://sourceforge.net/p/p7zip/bugs/147/ +Bug-Debian: https://bugs.debian.org/774660 + +Alexander Cherepanov discovered that 7zip is susceptible to a +directory traversal vulnerability. While extracting an archive, it +will extract symlinks and then follow them if they are referenced in +further entries. This can be exploited by a rogue archive to write +files outside the current directory. + +We have to create placeholder files (which we already do) and delay +creating symlinks until the end of extraction. + +Due to the possibility of anti-items (deletions) in the archive, it is +possible for placeholders to be deleted and replaced before we create +the symlinks. It's not clear that this can be used for mischief, but +GNU tar guards against similar problems by checking that the placeholder +still exists and is the same inode. XXX It also checks 'birth time' but +this isn't portable. We can probably get away with comparing ctime +since we don't support hard links. + +--- a/CPP/7zip/UI/Agent/Agent.cpp ++++ b/CPP/7zip/UI/Agent/Agent.cpp +@@ -424,6 +424,8 @@ STDMETHODIMP CAgentFolder::Extract(const + CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec; + UStringVector pathParts; + CProxyFolder *currentProxyFolder = _proxyFolderItem; ++ HRESULT res; ++ + while (currentProxyFolder->Parent) + { + pathParts.Insert(0, currentProxyFolder->Name); +@@ -445,8 +447,11 @@ STDMETHODIMP CAgentFolder::Extract(const + (UInt64)(Int64)-1); + CUIntVector realIndices; + GetRealIndices(indices, numItems, realIndices); +- return _agentSpec->GetArchive()->Extract(&realIndices.Front(), ++ res = _agentSpec->GetArchive()->Extract(&realIndices.Front(), + realIndices.Size(), testMode, extractCallback); ++ if (res == S_OK && !extractCallbackSpec->CreateSymLinks()) ++ res = E_FAIL; ++ return res; + COM_TRY_END + } + +--- a/CPP/7zip/UI/Agent/ArchiveFolder.cpp ++++ b/CPP/7zip/UI/Agent/ArchiveFolder.cpp +@@ -20,6 +20,8 @@ STDMETHODIMP CAgentFolder::CopyTo(const + CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec; + UStringVector pathParts; + CProxyFolder *currentProxyFolder = _proxyFolderItem; ++ HRESULT res; ++ + while (currentProxyFolder->Parent) + { + pathParts.Insert(0, currentProxyFolder->Name); +@@ -46,8 +48,11 @@ STDMETHODIMP CAgentFolder::CopyTo(const + (UInt64)(Int64)-1); + CUIntVector realIndices; + GetRealIndices(indices, numItems, realIndices); +- return _agentSpec->GetArchive()->Extract(&realIndices.Front(), ++ res = _agentSpec->GetArchive()->Extract(&realIndices.Front(), + realIndices.Size(), BoolToInt(false), extractCallback); ++ if (res == S_OK && !extractCallbackSpec->CreateSymLinks()) ++ res = E_FAIL; ++ return res; + COM_TRY_END + } + +--- a/CPP/7zip/UI/Client7z/Client7z.cpp ++++ b/CPP/7zip/UI/Client7z/Client7z.cpp +@@ -197,8 +197,11 @@ private: + COutFileStream *_outFileStreamSpec; + CMyComPtr<ISequentialOutStream> _outFileStream; + ++ CObjectVector<NWindows::NFile::NDirectory::CDelayedSymLink> _delayedSymLinks; ++ + public: + void Init(IInArchive *archiveHandler, const UString &directoryPath); ++ bool CreateSymLinks(); + + UInt64 NumErrors; + bool PasswordIsDefined; +@@ -392,11 +395,22 @@ STDMETHODIMP CArchiveExtractCallback::Se + } + _outFileStream.Release(); + if (_extractMode && _processedFileInfo.AttribDefined) +- NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attrib); ++ NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attrib, &_delayedSymLinks); + PrintNewLine(); + return S_OK; + } + ++bool CArchiveExtractCallback::CreateSymLinks() ++{ ++ bool success = true; ++ ++ for (int i = 0; i != _delayedSymLinks.Size(); ++i) ++ success &= _delayedSymLinks[i].Create(); ++ ++ _delayedSymLinks.Clear(); ++ ++ return success; ++} + + STDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password) + { +--- a/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp ++++ b/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp +@@ -453,12 +453,24 @@ STDMETHODIMP CArchiveExtractCallback::Se + NumFiles++; + + if (_extractMode && _fi.AttribDefined) +- NFile::NDirectory::MySetFileAttributes(_diskFilePath, _fi.Attrib); ++ NFile::NDirectory::MySetFileAttributes(_diskFilePath, _fi.Attrib, &_delayedSymLinks); + RINOK(_extractCallback2->SetOperationResult(operationResult, _encrypted)); + return S_OK; + COM_TRY_END + } + ++bool CArchiveExtractCallback::CreateSymLinks() ++{ ++ bool success = true; ++ ++ for (int i = 0; i != _delayedSymLinks.Size(); ++i) ++ success &= _delayedSymLinks[i].Create(); ++ ++ _delayedSymLinks.Clear(); ++ ++ return success; ++} ++ + /* + STDMETHODIMP CArchiveExtractCallback::GetInStream( + const wchar_t *name, ISequentialInStream **inStream) +--- a/CPP/7zip/UI/Common/ArchiveExtractCallback.h ++++ b/CPP/7zip/UI/Common/ArchiveExtractCallback.h +@@ -6,6 +6,8 @@ + #include "Common/MyCom.h" + #include "Common/Wildcard.h" + ++#include "Windows/FileDir.h" ++ + #include "../../IPassword.h" + + #include "../../Common/FileStreams.h" +@@ -83,6 +85,8 @@ class CArchiveExtractCallback: + UInt64 _packTotal; + UInt64 _unpTotal; + ++ CObjectVector<NWindows::NFile::NDirectory::CDelayedSymLink> _delayedSymLinks; ++ + void CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath); + HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined); + HRESULT GetUnpackSize(); +@@ -138,6 +142,7 @@ public: + const UStringVector &removePathParts, + UInt64 packSize); + ++ bool CreateSymLinks(); + }; + + #endif +--- a/CPP/7zip/UI/Common/Extract.cpp ++++ b/CPP/7zip/UI/Common/Extract.cpp +@@ -96,6 +96,9 @@ static HRESULT DecompressArchive( + else + result = archive->Extract(&realIndices.Front(), realIndices.Size(), testMode, extractCallbackSpec); + ++ if (result == S_OK && !extractCallbackSpec->CreateSymLinks()) ++ result = E_FAIL; ++ + return callback->ExtractResult(result); + } + +--- a/CPP/Windows/FileDir.cpp ++++ b/CPP/Windows/FileDir.cpp +@@ -453,9 +453,10 @@ bool SetDirTime(LPCWSTR fileName, const + } + + #ifndef _UNICODE +-bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes) ++bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes, ++ CObjectVector<CDelayedSymLink> *delayedSymLinks) + { +- return MySetFileAttributes(UnicodeStringToMultiByte(fileName, CP_ACP), fileAttributes); ++ return MySetFileAttributes(UnicodeStringToMultiByte(fileName, CP_ACP), fileAttributes, delayedSymLinks); + } + + bool MyRemoveDirectory(LPCWSTR pathName) +@@ -488,7 +489,8 @@ static int convert_to_symlink(const char + return -1; + } + +-bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes) ++bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes, ++ CObjectVector<CDelayedSymLink> *delayedSymLinks) + { + if (!fileName) { + SetLastError(ERROR_PATH_NOT_FOUND); +@@ -520,7 +522,9 @@ bool MySetFileAttributes(LPCTSTR fileNam + stat_info.st_mode = fileAttributes >> 16; + #ifdef ENV_HAVE_LSTAT + if (S_ISLNK(stat_info.st_mode)) { +- if ( convert_to_symlink(name) != 0) { ++ if (delayedSymLinks) ++ delayedSymLinks->Add(CDelayedSymLink(name)); ++ else if ( convert_to_symlink(name) != 0) { + TRACEN((printf("MySetFileAttributes(%s,%d) : false-3\n",name,fileAttributes))) + return false; + } +@@ -924,4 +928,41 @@ bool CTempDirectory::Create(LPCTSTR pref + } + + ++#ifdef ENV_UNIX ++ ++CDelayedSymLink::CDelayedSymLink(LPCSTR source) ++ : _source(source) ++{ ++ struct stat st; ++ ++ if (lstat(_source, &st) == 0) { ++ _dev = st.st_dev; ++ _ino = st.st_ino; ++ } else { ++ _dev = 0; ++ } ++} ++ ++bool CDelayedSymLink::Create() ++{ ++ struct stat st; ++ ++ if (_dev == 0) { ++ errno = EPERM; ++ return false; ++ } ++ if (lstat(_source, &st) != 0) ++ return false; ++ if (_dev != st.st_dev || _ino != st.st_ino) { ++ // Placeholder file has been overwritten or moved by another ++ // symbolic link creation ++ errno = EPERM; ++ return false; ++ } ++ ++ return convert_to_symlink(_source) == 0; ++} ++ ++#endif // ENV_UNIX ++ + }}} +--- a/CPP/Windows/FileDir.h ++++ b/CPP/Windows/FileDir.h +@@ -4,6 +4,7 @@ + #define __WINDOWS_FILEDIR_H + + #include "../Common/MyString.h" ++#include "../Common/MyVector.h" + #include "Defs.h" + + /* GetFullPathName for 7zAES.cpp */ +@@ -13,11 +14,15 @@ namespace NWindows { + namespace NFile { + namespace NDirectory { + ++class CDelayedSymLink; ++ + bool SetDirTime(LPCWSTR fileName, const FILETIME *creationTime, const FILETIME *lastAccessTime, const FILETIME *lastWriteTime); + +-bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes); ++bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes, ++ CObjectVector<CDelayedSymLink> *delayedSymLinks = 0); + #ifndef _UNICODE +-bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes); ++bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes, ++ CObjectVector<CDelayedSymLink> *delayedSymLinks = 0); + #endif + + bool MyMoveFile(LPCTSTR existFileName, LPCTSTR newFileName); +@@ -80,6 +85,31 @@ public: + bool Remove(); + }; + ++// Symbolic links must be created last so that they can't be used to ++// create or overwrite files above the extraction directory. ++class CDelayedSymLink ++{ ++#ifdef ENV_UNIX ++ // Where the symlink should be created. The target is specified in ++ // the placeholder file. ++ AString _source; ++ ++ // Device and inode of the placeholder file. Before creating the ++ // symlink, we must check that these haven't been changed by creation ++ // of another symlink. ++ dev_t _dev; ++ ino_t _ino; ++ ++public: ++ explicit CDelayedSymLink(LPCSTR source); ++ bool Create(); ++#else // !ENV_UNIX ++public: ++ CDelayedSymLink(LPCSTR source) {} ++ bool Create() { return true; } ++#endif // ENV_UNIX ++}; ++ + #ifdef _UNICODE + typedef CTempFile CTempFileW; + #endif diff --git a/app-arch/p7zip/files/p7zip-9.20.1-QA.patch b/app-arch/p7zip/files/p7zip-9.20.1-QA.patch new file mode 100644 index 000000000000..8845aca20707 --- /dev/null +++ b/app-arch/p7zip/files/p7zip-9.20.1-QA.patch @@ -0,0 +1,17 @@ +From: Julian Ospald <hasufell@gentoo.org> +Date: Thu Jun 7 14:31:12 UTC 2012 +Subject: fix QA warnings + +https://sourceforge.net/tracker/?func=detail&atid=660493&aid=3532590&group_id=111810 + +--- CPP/7zip/Archive/NtfsHandler.cpp ++++ CPP/7zip/Archive/NtfsHandler.cpp +@@ -1280,7 +1280,7 @@ + if (recSizeLog < Header.SectorSizeLog) + return false; + numSectorsInRec = 1 << (recSizeLog - Header.SectorSizeLog); +- if (!mftRec.Parse(ByteBuf, Header.SectorSizeLog, numSectorsInRec, NULL, 0)) ++ if (!mftRec.Parse(ByteBuf, Header.SectorSizeLog, numSectorsInRec, 0, NULL)) + return S_FALSE; + if (!mftRec.IsFILE()) + return S_FALSE; diff --git a/app-arch/p7zip/files/p7zip-9.20.1-execstack.patch b/app-arch/p7zip/files/p7zip-9.20.1-execstack.patch new file mode 100644 index 000000000000..1fdff481cf36 --- /dev/null +++ b/app-arch/p7zip/files/p7zip-9.20.1-execstack.patch @@ -0,0 +1,24 @@ +diff -Naupr p7zip_9.20.1.orig/Asm/x64/7zCrcT8U.asm p7zip_9.20.1/Asm/x64/7zCrcT8U.asm +--- p7zip_9.20.1.orig/Asm/x64/7zCrcT8U.asm 2008-08-14 11:18:07.000000000 +0200 ++++ p7zip_9.20.1/Asm/x64/7zCrcT8U.asm 2011-07-26 17:43:57.727910278 +0200 +@@ -101,3 +101,8 @@ _CrcUpdateT8:
+ ret
+
+ end
++
++%ifidn __OUTPUT_FORMAT__,elf
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++
+diff -Naupr p7zip_9.20.1.orig/Asm/x86/7zCrcT8U.asm p7zip_9.20.1/Asm/x86/7zCrcT8U.asm +--- p7zip_9.20.1.orig/Asm/x86/7zCrcT8U.asm 2009-07-14 12:44:15.000000000 +0200 ++++ p7zip_9.20.1/Asm/x86/7zCrcT8U.asm 2011-07-26 17:44:23.938864508 +0200 +@@ -99,3 +99,8 @@ _CrcUpdateT8:
+
+
+ ; end
++
++%ifidn __OUTPUT_FORMAT__,elf
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++
diff --git a/app-arch/p7zip/files/p7zip-9.20.1-long_rar_pwd.patch b/app-arch/p7zip/files/p7zip-9.20.1-long_rar_pwd.patch new file mode 100644 index 000000000000..ea7a90b71d44 --- /dev/null +++ b/app-arch/p7zip/files/p7zip-9.20.1-long_rar_pwd.patch @@ -0,0 +1,17 @@ +--- ./CPP/7zip/Crypto/Sha1.cpp 2010-10-20 06:56:08.000000000 +0200 ++++ CPP/7zip/Crypto/Sha1.cpp.new 2013-09-15 09:19:51.000000000 +0200 +@@ -148,10 +148,10 @@ + for (int i = 0; i < kBlockSizeInWords; i++) + { + UInt32 d = _buffer[i]; +- data[i * 4 + 0 - kBlockSize] = (Byte)(d); +- data[i * 4 + 1 - kBlockSize] = (Byte)(d >> 8); +- data[i * 4 + 2 - kBlockSize] = (Byte)(d >> 16); +- data[i * 4 + 3 - kBlockSize] = (Byte)(d >> 24); ++ data[(int)i * 4 + 0 - (int)kBlockSize] = (Byte)(d); ++ data[(int)i * 4 + 1 - (int)kBlockSize] = (Byte)(d >> 8); ++ data[(int)i * 4 + 2 - (int)kBlockSize] = (Byte)(d >> 16); ++ data[(int)i * 4 + 3 - (int)kBlockSize] = (Byte)(d >> 24); + } + returnRes = rar350Mode; + } diff --git a/app-arch/p7zip/files/p7zip-9.38.1-CVE-2015-1038.patch b/app-arch/p7zip/files/p7zip-9.38.1-CVE-2015-1038.patch new file mode 100644 index 000000000000..c4e443679b05 --- /dev/null +++ b/app-arch/p7zip/files/p7zip-9.38.1-CVE-2015-1038.patch @@ -0,0 +1,283 @@ +Author: Ben Hutchings <ben@decadent.org.uk> +Date: Tue, 19 May 2015 02:38:40 +0100 +Description: Delay creation of symlinks to prevent arbitrary file writes (CVE-2015-1038) +Bug: http://sourceforge.net/p/p7zip/bugs/147/ +Bug-Debian: https://bugs.debian.org/774660 + +Alexander Cherepanov discovered that 7zip is susceptible to a +directory traversal vulnerability. While extracting an archive, it +will extract symlinks and then follow them if they are referenced in +further entries. This can be exploited by a rogue archive to write +files outside the current directory. + +We have to create placeholder files (which we already do) and delay +creating symlinks until the end of extraction. + +Due to the possibility of anti-items (deletions) in the archive, it is +possible for placeholders to be deleted and replaced before we create +the symlinks. It's not clear that this can be used for mischief, but +GNU tar guards against similar problems by checking that the placeholder +still exists and is the same inode. XXX It also checks 'birth time' but +this isn't portable. We can probably get away with comparing ctime +since we don't support hard links. + +--- a/CPP/7zip/UI/Agent/Agent.cpp ++++ b/CPP/7zip/UI/Agent/Agent.cpp +@@ -1215,7 +1215,7 @@ STDMETHODIMP CAgentFolder::Extract(const + HRESULT result = _agentSpec->GetArchive()->Extract(&realIndices.Front(), + realIndices.Size(), testMode, extractCallback); + if (result == S_OK) +- result = extractCallbackSpec->SetDirsTimes(); ++ result = extractCallbackSpec->SetFinalAttribs(); + return result; + COM_TRY_END + } +--- a/CPP/7zip/UI/Client7z/Client7z.cpp ++++ b/CPP/7zip/UI/Client7z/Client7z.cpp +@@ -222,8 +222,11 @@ private: + COutFileStream *_outFileStreamSpec; + CMyComPtr<ISequentialOutStream> _outFileStream; + ++ CObjectVector<NWindows::NFile::NDir::CDelayedSymLink> _delayedSymLinks; ++ + public: + void Init(IInArchive *archiveHandler, const FString &directoryPath); ++ HRESULT SetFinalAttribs(); + + UInt64 NumErrors; + bool PasswordIsDefined; +@@ -441,11 +444,23 @@ STDMETHODIMP CArchiveExtractCallback::Se + } + _outFileStream.Release(); + if (_extractMode && _processedFileInfo.AttribDefined) +- SetFileAttrib(_diskFilePath, _processedFileInfo.Attrib); ++ SetFileAttrib(_diskFilePath, _processedFileInfo.Attrib, &_delayedSymLinks); + PrintNewLine(); + return S_OK; + } + ++HRESULT CArchiveExtractCallback::SetFinalAttribs() ++{ ++ HRESULT result = S_OK; ++ ++ for (int i = 0; i != _delayedSymLinks.Size(); ++i) ++ if (!_delayedSymLinks[i].Create()) ++ result = E_FAIL; ++ ++ _delayedSymLinks.Clear(); ++ ++ return result; ++} + + STDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password) + { +@@ -912,6 +927,8 @@ int MY_CDECL main(int numArgs, const cha + // extractCallbackSpec->PasswordIsDefined = true; + // extractCallbackSpec->Password = L"1"; + HRESULT result = archive->Extract(NULL, (UInt32)(Int32)(-1), false, extractCallback); ++ if (result == S_OK) ++ result = extractCallbackSpec->SetFinalAttribs(); + if (result != S_OK) + { + PrintError("Extract Error"); +--- a/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp ++++ b/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp +@@ -1083,7 +1083,7 @@ STDMETHODIMP CArchiveExtractCallback::Se + NumFiles++; + + if (_extractMode && _fi.AttribDefined) +- SetFileAttrib(_diskFilePath, _fi.Attrib); ++ SetFileAttrib(_diskFilePath, _fi.Attrib, &_delayedSymLinks); + RINOK(_extractCallback2->SetOperationResult(operationResult, _encrypted)); + return S_OK; + COM_TRY_END +@@ -1149,8 +1149,9 @@ static int GetNumSlashes(const FChar *s) + } + } + +-HRESULT CArchiveExtractCallback::SetDirsTimes() ++HRESULT CArchiveExtractCallback::SetFinalAttribs() + { ++ HRESULT result = S_OK; + CRecordVector<CExtrRefSortPair> pairs; + pairs.ClearAndSetSize(_extractedFolderPaths.Size()); + unsigned i; +@@ -1187,5 +1188,12 @@ HRESULT CArchiveExtractCallback::SetDirs + (WriteATime && ATimeDefined) ? &ATime : NULL, + (WriteMTime && MTimeDefined) ? &MTime : (_arc->MTimeDefined ? &_arc->MTime : NULL)); + } +- return S_OK; ++ ++ for (int i = 0; i != _delayedSymLinks.Size(); ++i) ++ if (!_delayedSymLinks[i].Create()) ++ result = E_FAIL; ++ ++ _delayedSymLinks.Clear(); ++ ++ return result; + } +--- a/CPP/7zip/UI/Common/ArchiveExtractCallback.h ++++ b/CPP/7zip/UI/Common/ArchiveExtractCallback.h +@@ -6,6 +6,8 @@ + #include "../../../Common/MyCom.h" + #include "../../../Common/Wildcard.h" + ++#include "../../../Windows/FileDir.h" ++ + #include "../../IPassword.h" + + #include "../../Common/FileStreams.h" +@@ -213,6 +215,8 @@ class CArchiveExtractCallback: + bool _saclEnabled; + #endif + ++ CObjectVector<NWindows::NFile::NDir::CDelayedSymLink> _delayedSymLinks; ++ + void CreateComplexDirectory(const UStringVector &dirPathParts, FString &fullPath); + HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined); + HRESULT GetUnpackSize(); +@@ -293,7 +297,7 @@ public: + _baseParentFolder = indexInArc; + } + +- HRESULT SetDirsTimes(); ++ HRESULT SetFinalAttribs(); + }; + + #endif +--- a/CPP/7zip/UI/Common/Extract.cpp ++++ b/CPP/7zip/UI/Common/Extract.cpp +@@ -170,7 +170,7 @@ static HRESULT DecompressArchive( + else + result = archive->Extract(&realIndices.Front(), realIndices.Size(), testMode, ecs); + if (result == S_OK && !options.StdInMode) +- result = ecs->SetDirsTimes(); ++ result = ecs->SetFinalAttribs(); + return callback->ExtractResult(result); + } + +--- a/CPP/Windows/FileDir.cpp ++++ b/CPP/Windows/FileDir.cpp +@@ -343,7 +343,8 @@ static int convert_to_symlink(const char + return -1; + } + +-bool SetFileAttrib(CFSTR fileName, DWORD fileAttributes) ++bool SetFileAttrib(CFSTR fileName, DWORD fileAttributes, ++ CObjectVector<CDelayedSymLink> *delayedSymLinks) + { + if (!fileName) { + SetLastError(ERROR_PATH_NOT_FOUND); +@@ -375,7 +376,9 @@ bool SetFileAttrib(CFSTR fileName, DWORD + stat_info.st_mode = fileAttributes >> 16; + #ifdef ENV_HAVE_LSTAT + if (S_ISLNK(stat_info.st_mode)) { +- if ( convert_to_symlink(name) != 0) { ++ if (delayedSymLinks) ++ delayedSymLinks->Add(CDelayedSymLink(name)); ++ else if ( convert_to_symlink(name) != 0) { + TRACEN((printf("SetFileAttrib(%s,%d) : false-3\n",(const char *)name,fileAttributes))) + return false; + } +@@ -885,6 +888,43 @@ bool CTempDir::Remove() + return !_mustBeDeleted; + } + ++#ifdef ENV_UNIX ++ ++CDelayedSymLink::CDelayedSymLink(const char * source) ++ : _source(source) ++{ ++ struct stat st; ++ ++ if (lstat(_source, &st) == 0) { ++ _dev = st.st_dev; ++ _ino = st.st_ino; ++ } else { ++ _dev = 0; ++ } ++} ++ ++bool CDelayedSymLink::Create() ++{ ++ struct stat st; ++ ++ if (_dev == 0) { ++ errno = EPERM; ++ return false; ++ } ++ if (lstat(_source, &st) != 0) ++ return false; ++ if (_dev != st.st_dev || _ino != st.st_ino) { ++ // Placeholder file has been overwritten or moved by another ++ // symbolic link creation ++ errno = EPERM; ++ return false; ++ } ++ ++ return convert_to_symlink(_source) == 0; ++} ++ ++#endif // ENV_UNIX ++ + }}} + + +--- a/CPP/Windows/FileDir.h ++++ b/CPP/Windows/FileDir.h +@@ -4,6 +4,7 @@ + #define __WINDOWS_FILE_DIR_H + + #include "../Common/MyString.h" ++#include "../Common/MyVector.h" + + #include "FileIO.h" + +@@ -11,11 +12,14 @@ namespace NWindows { + namespace NFile { + namespace NDir { + ++class CDelayedSymLink; ++ + bool GetWindowsDir(FString &path); + bool GetSystemDir(FString &path); + + bool SetDirTime(CFSTR path, const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime); +-bool SetFileAttrib(CFSTR path, DWORD attrib); ++bool SetFileAttrib(CFSTR path, DWORD attrib, ++ CObjectVector<CDelayedSymLink> *delayedSymLinks = 0); + bool MyMoveFile(CFSTR existFileName, CFSTR newFileName); + + #ifndef UNDER_CE +@@ -69,6 +73,31 @@ public: + bool Remove(); + }; + ++// Symbolic links must be created last so that they can't be used to ++// create or overwrite files above the extraction directory. ++class CDelayedSymLink ++{ ++#ifdef ENV_UNIX ++ // Where the symlink should be created. The target is specified in ++ // the placeholder file. ++ AString _source; ++ ++ // Device and inode of the placeholder file. Before creating the ++ // symlink, we must check that these haven't been changed by creation ++ // of another symlink. ++ dev_t _dev; ++ ino_t _ino; ++ ++public: ++ explicit CDelayedSymLink(const char * source); ++ bool Create(); ++#else // !ENV_UNIX ++public: ++ CDelayedSymLink(const char * source) {} ++ bool Create() { return true; } ++#endif // ENV_UNIX ++}; ++ + #if !defined(UNDER_CE) + class CCurrentDirRestorer + { diff --git a/app-arch/p7zip/files/p7zip-9.38.1-osversion.patch b/app-arch/p7zip/files/p7zip-9.38.1-osversion.patch new file mode 100644 index 000000000000..49e0653e43ef --- /dev/null +++ b/app-arch/p7zip/files/p7zip-9.38.1-osversion.patch @@ -0,0 +1,28 @@ +diff -Naur old/CPP/7zip/UI/FileManager/FM.cpp new/CPP/7zip/UI/FileManager/FM.cpp +--- old/CPP/7zip/UI/FileManager/FM.cpp 2015-01-18 08:59:09.000000000 -1000 ++++ new/CPP/7zip/UI/FileManager/FM.cpp 2015-02-09 11:39:55.575712452 -1000 +@@ -348,24 +348,7 @@ + + bool IsLargePageSupported() + { +- #ifdef _WIN64 + return true; +- #else +- OSVERSIONINFO versionInfo; +- versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); +- if (!::GetVersionEx(&versionInfo)) +- return false; +- if (versionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || versionInfo.dwMajorVersion < 5) +- return false; +- if (versionInfo.dwMajorVersion > 5) +- return true; +- if (versionInfo.dwMinorVersion < 1) +- return false; +- if (versionInfo.dwMinorVersion > 1) +- return true; +- // return IsWow64(); +- return false; +- #endif + } + + #if 0 //#ifndef UNDER_CE diff --git a/app-arch/p7zip/metadata.xml b/app-arch/p7zip/metadata.xml new file mode 100644 index 000000000000..9ed2c1559b3e --- /dev/null +++ b/app-arch/p7zip/metadata.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <maintainer> + <email>jlec@gentoo.org</email> + <description>maintainer</description> + </maintainer> + <use> + <flag name="rar">Enable support for non-free rar decoder</flag> + </use> + <upstream> + <remote-id type="sourceforge">p7zip</remote-id> + </upstream> +</pkgmetadata> diff --git a/app-arch/p7zip/p7zip-9.20.1-r5.ebuild b/app-arch/p7zip/p7zip-9.20.1-r5.ebuild new file mode 100644 index 000000000000..6b114776dd59 --- /dev/null +++ b/app-arch/p7zip/p7zip-9.20.1-r5.ebuild @@ -0,0 +1,155 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=4 + +WX_GTK_VER="2.8" + +inherit eutils multilib toolchain-funcs wxwidgets + +DESCRIPTION="Port of 7-Zip archiver for Unix" +HOMEPAGE="http://p7zip.sourceforge.net/" +SRC_URI="mirror://sourceforge/${PN}/${PN}_${PV}_src_all.tar.bz2" + +LICENSE="LGPL-2.1 rar? ( unRAR )" +SLOT="0" +KEYWORDS="alpha amd64 ~arm hppa ia64 ppc ppc64 ~s390 sparc x86 ~x86-fbsd ~x86-freebsd ~x86-interix ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris" +IUSE="doc kde rar +pch static wxwidgets" + +REQUIRED_USE="kde? ( wxwidgets )" + +RDEPEND=" + kde? ( x11-libs/wxGTK:2.8[X,-odbc] kde-base/kdelibs ) + wxwidgets? ( x11-libs/wxGTK:2.8[X,-odbc] )" +DEPEND="${RDEPEND} + amd64? ( dev-lang/yasm ) + x86? ( dev-lang/nasm )" + +S=${WORKDIR}/${PN}_${PV} + +src_prepare() { + epatch \ + "${FILESDIR}"/${P}-execstack.patch \ + "${FILESDIR}"/${P}-QA.patch \ + "${FILESDIR}"/${P}-CVE-2015-1038.patch + + if ! use pch; then + sed "s:PRE_COMPILED_HEADER=StdAfx.h.gch:PRE_COMPILED_HEADER=:g" -i makefile.* || die + fi + + sed \ + -e 's:-m32 ::g' \ + -e 's:-m64 ::g' \ + -e 's:-O::g' \ + -e 's:-pipe::g' \ + -e "/^CC/s:\$(ALLFLAGS):${CFLAGS} \$(ALLFLAGS):g" \ + -e "/^CXX/s:\$(ALLFLAGS):${CXXFLAGS} \$(ALLFLAGS):g" \ + -i makefile* || die + + # remove non-free RAR codec + if use rar; then + ewarn "Enabling nonfree RAR decompressor" + else + sed -e '/Rar/d' -i makefile* || die + rm -rf CPP/7zip/Compress/Rar || die + epatch "${FILESDIR}"/9.04-makefile.patch + fi + + sed -i \ + -e "/^CXX=/s:g++:$(tc-getCXX):" \ + -e "/^CC=/s:gcc:$(tc-getCC):" \ + -e '/ALLFLAGS/s:-s ::' \ + makefile* || die "changing makefiles" + + if use amd64; then + cp -f makefile.linux_amd64_asm makefile.machine || die + elif use x86; then + cp -f makefile.linux_x86_asm_gcc_4.X makefile.machine || die + elif [[ ${CHOST} == *-darwin* ]] ; then + # Mac OS X needs this special makefile, because it has a non-GNU linker + [[ ${CHOST} == *64-* ]] \ + && cp -f makefile.macosx_64bits makefile.machine \ + || cp -f makefile.macosx_32bits makefile.machine + # bundles have extension .bundle but don't die because USE=-rar + # removes the Rar directory + sed -i -e '/strcpy(name/s/\.so/.bundle/' \ + CPP/Windows/DLL.cpp || die + sed -i -e '/^PROG=/s/\.so/.bundle/' \ + CPP/7zip/Bundles/Format7zFree/makefile \ + $(use rar && echo CPP/7zip/Compress/Rar/makefile) || die + elif use x86-fbsd; then + # FreeBSD needs this special makefile, because it hasn't -ldl + sed -e 's/-lc_r/-pthread/' makefile.freebsd > makefile.machine + fi + + if use static; then + sed -i -e '/^LOCAL_LIBS=/s/LOCAL_LIBS=/&-static /' makefile.machine || die + fi + + if use kde || use wxwidgets; then + einfo "Preparing dependency list" + emake depend + fi +} + +src_compile() { + emake all3 + if use kde || use wxwidgets; then + emake -- 7zG + emake -- 7zFM + fi +} + +src_test() { + emake test test_7z test_7zr +} + +src_install() { + # this wrappers can not be symlinks, p7zip should be called with full path + make_wrapper 7zr "/usr/$(get_libdir)/${PN}/7zr" + make_wrapper 7za "/usr/$(get_libdir)/${PN}/7za" + make_wrapper 7z "/usr/$(get_libdir)/${PN}/7z" + + if use kde || use wxwidgets; then + make_wrapper 7zG "/usr/$(get_libdir)/${PN}/7zG" + make_wrapper 7zFM "/usr/$(get_libdir)/${PN}/7zFM" + + make_desktop_entry 7zFM "${PN} FM" ${PN} "GTK;Utility;Archiving;Compression" + + dobin GUI/p7zipForFilemanager + exeinto /usr/$(get_libdir)/${PN} + doexe bin/7z{G,FM} + + insinto /usr/$(get_libdir)/${PN} + doins -r GUI/{Lang,help} + + insinto /usr/share/icons/hicolor/16x16/apps/ + newins GUI/p7zip_16_ok.png p7zip.png + + if use kde; then + rm GUI/kde4/p7zip_compress.desktop || die + insinto /usr/share/kde4/services/ServiceMenus + doins GUI/kde4/*.desktop + fi + fi + + dobin contrib/gzip-like_CLI_wrapper_for_7z/p7zip + doman contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1 + + exeinto /usr/$(get_libdir)/${PN} + doexe bin/7z bin/7za bin/7zr bin/7zCon.sfx + doexe bin/*$(get_modname) + if use rar; then + exeinto /usr/$(get_libdir)/${PN}/Codecs/ + doexe bin/Codecs/*$(get_modname) + fi + + doman man1/7z.1 man1/7za.1 man1/7zr.1 + dodoc ChangeLog README TODO + + if use doc; then + dodoc DOCS/*.txt + dohtml -r DOCS/MANUAL/* + fi +} diff --git a/app-arch/p7zip/p7zip-9.38.1-r2.ebuild b/app-arch/p7zip/p7zip-9.38.1-r2.ebuild new file mode 100644 index 000000000000..7e779e8cd478 --- /dev/null +++ b/app-arch/p7zip/p7zip-9.38.1-r2.ebuild @@ -0,0 +1,156 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=5 + +WX_GTK_VER="2.8" + +inherit eutils multilib toolchain-funcs wxwidgets + +DESCRIPTION="Port of 7-Zip archiver for Unix" +HOMEPAGE="http://p7zip.sourceforge.net/" +SRC_URI="mirror://sourceforge/${PN}/${PN}_${PV}_src_all.tar.bz2" + +LICENSE="LGPL-2.1 rar? ( unRAR )" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~s390 ~sparc ~x86 ~x86-fbsd ~x86-freebsd ~x86-interix ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris" +IUSE="doc kde rar +pch static wxwidgets abi_x86_x32" + +REQUIRED_USE="kde? ( wxwidgets )" + +RDEPEND=" + kde? ( x11-libs/wxGTK:2.8[X,-odbc] kde-base/kdelibs ) + wxwidgets? ( x11-libs/wxGTK:2.8[X,-odbc] )" +DEPEND="${RDEPEND} + amd64? ( dev-lang/yasm ) + abi_x86_x32? ( >=dev-lang/yasm-1.2.0-r1 ) + x86? ( dev-lang/nasm )" + +S=${WORKDIR}/${PN}_${PV} + +src_prepare() { + epatch \ + "${FILESDIR}"/${P}-osversion.patch \ + "${FILESDIR}"/${P}-CVE-2015-1038.patch + + if ! use pch; then + sed "s:PRE_COMPILED_HEADER=StdAfx.h.gch:PRE_COMPILED_HEADER=:g" -i makefile.* || die + fi + + sed \ + -e 's:-m32 ::g' \ + -e 's:-m64 ::g' \ + -e 's:-O::g' \ + -e 's:-pipe::g' \ + -e "/^CXX=/s:g++:$(tc-getCXX):" \ + -e "/^CC=/s:gcc:$(tc-getCC):" \ + -e '/ALLFLAGS/s:-s ::' \ + -e "/OPTFLAGS=/s:=.*:=${CXXFLAGS}:" \ + -i makefile* || die + + # remove non-free RAR codec + if use rar; then + ewarn "Enabling nonfree RAR decompressor" + else + sed \ + -e '/Rar/d' \ + -e '/RAR/d' \ + -i makefile* CPP/7zip/Bundles/Format7zFree/makefile || die + rm -rf CPP/7zip/Compress/Rar || die + fi + + if use abi_x86_x32; then + sed -i -e "/^ASM=/s:amd64:x32:" makefile* + cp -f makefile.linux_amd64_asm makefile.machine || die + elif use amd64; then + cp -f makefile.linux_amd64_asm makefile.machine || die + elif use x86; then + cp -f makefile.linux_x86_asm_gcc_4.X makefile.machine || die + elif [[ ${CHOST} == *-darwin* ]] ; then + # Mac OS X needs this special makefile, because it has a non-GNU linker + [[ ${CHOST} == *64-* ]] \ + && cp -f makefile.macosx_64bits makefile.machine \ + || cp -f makefile.macosx_32bits makefile.machine + # bundles have extension .bundle but don't die because USE=-rar + # removes the Rar directory + sed -i -e '/strcpy(name/s/\.so/.bundle/' \ + CPP/Windows/DLL.cpp || die + sed -i -e '/^PROG=/s/\.so/.bundle/' \ + CPP/7zip/Bundles/Format7zFree/makefile \ + $(use rar && echo CPP/7zip/Compress/Rar/makefile) || die + elif use x86-fbsd; then + # FreeBSD needs this special makefile, because it hasn't -ldl + sed -e 's/-lc_r/-pthread/' makefile.freebsd > makefile.machine + fi + + if use static; then + sed -i -e '/^LOCAL_LIBS=/s/LOCAL_LIBS=/&-static /' makefile.machine || die + fi + + if use kde || use wxwidgets; then + einfo "Preparing dependency list" + emake depend + fi +} + +src_compile() { + emake all3 + if use kde || use wxwidgets; then + emake -- 7zG + emake -- 7zFM + fi +} + +src_test() { + emake test test_7z test_7zr +} + +src_install() { + # this wrappers can not be symlinks, p7zip should be called with full path + make_wrapper 7zr "/usr/$(get_libdir)/${PN}/7zr" + make_wrapper 7za "/usr/$(get_libdir)/${PN}/7za" + make_wrapper 7z "/usr/$(get_libdir)/${PN}/7z" + + if use kde || use wxwidgets; then + make_wrapper 7zG "/usr/$(get_libdir)/${PN}/7zG" + make_wrapper 7zFM "/usr/$(get_libdir)/${PN}/7zFM" + + make_desktop_entry 7zFM "${PN} FM" ${PN} "GTK;Utility;Archiving;Compression" + + dobin GUI/p7zipForFilemanager + exeinto /usr/$(get_libdir)/${PN} + doexe bin/7z{G,FM} + + insinto /usr/$(get_libdir)/${PN} + doins -r GUI/{Lang,help} + + insinto /usr/share/icons/hicolor/16x16/apps/ + newins GUI/p7zip_16_ok.png p7zip.png + + if use kde; then + rm GUI/kde4/p7zip_compress.desktop || die + insinto /usr/share/kde4/services/ServiceMenus + doins GUI/kde4/*.desktop + fi + fi + + dobin contrib/gzip-like_CLI_wrapper_for_7z/p7zip + doman contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1 + + exeinto /usr/$(get_libdir)/${PN} + doexe bin/7z bin/7za bin/7zr bin/7zCon.sfx + doexe bin/*$(get_modname) + if use rar; then + exeinto /usr/$(get_libdir)/${PN}/Codecs/ + doexe bin/Codecs/*$(get_modname) + fi + + doman man1/7z.1 man1/7za.1 man1/7zr.1 + dodoc ChangeLog README TODO + + if use doc; then + dodoc DOC/*.txt + dohtml -r DOC/MANUAL/* + fi +} |