diff options
author | Underground78 <underground78@users.sourceforge.net> | 2015-06-01 00:15:05 +0300 |
---|---|---|
committer | Underground78 <underground78@users.sourceforge.net> | 2015-06-01 00:15:05 +0300 |
commit | 846eff07c13899dd7d3bf38251886b5263d41213 (patch) | |
tree | 9451569d7d9f03251eb2e385040af74d4a508ab2 /src/thirdparty/unrar/ulinks.cpp | |
parent | 6fcba1bead7608fb480ab943ab9689bc66f4e009 (diff) | |
parent | e3f50f602e94794e29a17407e46b64b1ebb32232 (diff) |
Merge branch 'release-1.7.9'1.7.9
Diffstat (limited to 'src/thirdparty/unrar/ulinks.cpp')
-rw-r--r-- | src/thirdparty/unrar/ulinks.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/thirdparty/unrar/ulinks.cpp b/src/thirdparty/unrar/ulinks.cpp index b51ff6282..c6d2f874a 100644 --- a/src/thirdparty/unrar/ulinks.cpp +++ b/src/thirdparty/unrar/ulinks.cpp @@ -30,7 +30,13 @@ static bool UnixSymlink(const char *Target,const wchar *LinkName,RarTime *ftm,Ra } -bool ExtractUnixLink30(ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName) +static bool IsFullPath(const char *PathA) // Unix ASCII version. +{ + return *PathA==CPATHDIVIDER; +} + + +bool ExtractUnixLink30(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName) { char Target[NM]; if (IsLink(Arc.FileHead.FileAttr)) @@ -48,13 +54,16 @@ bool ExtractUnixLink30(ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName) if (!DataIO.UnpHash.Cmp(&Arc.FileHead.FileHash,Arc.FileHead.UseHashKey ? Arc.FileHead.HashKey:NULL)) return true; + if (!Cmd->AbsoluteLinks && (IsFullPath(Target) || + !IsRelativeSymlinkSafe(Arc.FileHead.FileName,Arc.FileHead.RedirName))) + return false; return UnixSymlink(Target,LinkName,&Arc.FileHead.mtime,&Arc.FileHead.atime); } return false; } -bool ExtractUnixLink50(const wchar *Name,FileHeader *hd) +bool ExtractUnixLink50(CommandData *Cmd,const wchar *Name,FileHeader *hd) { char Target[NM]; WideToChar(hd->RedirName,Target,ASIZE(Target)); @@ -68,5 +77,8 @@ bool ExtractUnixLink50(const wchar *Name,FileHeader *hd) return false; DosSlashToUnix(Target,Target,ASIZE(Target)); } + if (!Cmd->AbsoluteLinks && (IsFullPath(Target) || + !IsRelativeSymlinkSafe(hd->FileName,hd->RedirName))) + return false; return UnixSymlink(Target,Name,&hd->mtime,&hd->atime); } |