Skip to content

Commit 88d621e

Browse files
committed
Add unrar version 6.0.3
1 parent 8c6053a commit 88d621e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+721
-391
lines changed

acknow.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
* RAR uses CRC32 function based on Intel Slicing-by-8 algorithm.
5252
Original Intel Slicing-by-8 code is available here:
5353

54-
http://sourceforge.net/projects/slicing-by-8/
54+
https://sourceforge.net/projects/slicing-by-8/
5555

5656
Original Intel Slicing-by-8 code is licensed under BSD License
5757
available at http://www.opensource.org/licenses/bsd-license.html

arccmt.cpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,15 @@ bool Archive::GetComment(Array<wchar> *CmtData)
44
{
55
if (!MainComment)
66
return false;
7-
SaveFilePos SavePos(*this);
7+
int64 SavePos=Tell();
8+
bool Success=DoGetComment(CmtData);
9+
Seek(SavePos,SEEK_SET);
10+
return Success;
11+
}
12+
813

14+
bool Archive::DoGetComment(Array<wchar> *CmtData)
15+
{
916
#ifndef SFX_MODULE
1017
uint CmtLength;
1118
if (Format==RARFMT14)
@@ -136,7 +143,7 @@ bool Archive::GetComment(Array<wchar> *CmtData)
136143
bool Archive::ReadCommentData(Array<wchar> *CmtData)
137144
{
138145
Array<byte> CmtRaw;
139-
if (!ReadSubData(&CmtRaw,NULL))
146+
if (!ReadSubData(&CmtRaw,NULL,false))
140147
return false;
141148
size_t CmtSize=CmtRaw.Size();
142149
CmtRaw.Push(0);

archive.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,8 @@ bool Archive::IsArchive(bool EnableBroken)
208208
break;
209209
}
210210

211-
// This check allows to make RS based recovery even if password is incorrect.
212-
// But we should not do it for EnableBroken or we'll get 'not RAR archive'
211+
212+
// We should not do it for EnableBroken or we'll get 'not RAR archive'
213213
// messages when extracting encrypted archives with wrong password.
214214
if (FailedHeaderDecryption && !EnableBroken)
215215
return false;
@@ -233,7 +233,7 @@ bool Archive::IsArchive(bool EnableBroken)
233233
// immediately after IsArchive call.
234234
if (HeadersLeft && (!SilentOpen || !Encrypted))
235235
{
236-
SaveFilePos SavePos(*this);
236+
int64 SavePos=Tell();
237237
int64 SaveCurBlockPos=CurBlockPos,SaveNextBlockPos=NextBlockPos;
238238
HEADER_TYPE SaveCurHeaderType=CurHeaderType;
239239

@@ -262,6 +262,7 @@ bool Archive::IsArchive(bool EnableBroken)
262262
CurBlockPos=SaveCurBlockPos;
263263
NextBlockPos=SaveNextBlockPos;
264264
CurHeaderType=SaveCurHeaderType;
265+
Seek(SavePos,SEEK_SET);
265266
}
266267
if (!Volume || FirstVolume)
267268
wcsncpyz(FirstVolumeName,FileName,ASIZE(FirstVolumeName));

archive.hpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ class Archive:public File
2929
void UpdateLatestTime(FileHeader *CurBlock);
3030
void ConvertNameCase(wchar *Name);
3131
void ConvertFileHeader(FileHeader *hd);
32-
void WriteBlock50(HEADER_TYPE HeaderType,BaseBlock *wb,bool OnlySetSize,bool NonFinalWrite);
3332
size_t ReadHeader14();
3433
size_t ReadHeader15();
3534
size_t ReadHeader50();
@@ -38,6 +37,7 @@ class Archive:public File
3837
void UnexpEndArcMsg();
3938
void BrokenHeaderMsg();
4039
void UnkEncVerMsg(const wchar *Name,const wchar *Info);
40+
bool DoGetComment(Array<wchar> *CmtData);
4141
bool ReadCommentData(Array<wchar> *CmtData);
4242

4343
#if !defined(RAR_NOCRYPT)
@@ -65,8 +65,6 @@ class Archive:public File
6565
size_t SearchBlock(HEADER_TYPE HeaderType);
6666
size_t SearchSubBlock(const wchar *Type);
6767
size_t SearchRR();
68-
void WriteBlock(HEADER_TYPE HeaderType,BaseBlock *wb=NULL,bool OnlySetSize=false,bool NonFinalWrite=false);
69-
void SetBlockSize(HEADER_TYPE HeaderType,BaseBlock *wb=NULL) {WriteBlock(HeaderType,wb,true);}
7068
size_t ReadHeader();
7169
void CheckArc(bool EnableBroken);
7270
void CheckOpen(const wchar *Name);
@@ -83,7 +81,7 @@ class Archive:public File
8381
int64 GetStartPos();
8482
void AddSubData(byte *SrcData,uint64 DataSize,File *SrcFile,
8583
const wchar *Name,uint Flags);
86-
bool ReadSubData(Array<byte> *UnpData,File *DestFile);
84+
bool ReadSubData(Array<byte> *UnpData,File *DestFile,bool TestMode);
8785
HEADER_TYPE GetHeaderType() {return CurHeaderType;}
8886
RAROptions* GetRAROptions() {return Cmd;}
8987
void SetSilentOpen(bool Mode) {SilentOpen=Mode;}

arcread.cpp

+16-13
Original file line numberDiff line numberDiff line change
@@ -268,14 +268,14 @@ size_t Archive::ReadHeader15()
268268
uint FileTime=Raw.Get4();
269269
hd->UnpVer=Raw.Get1();
270270

271-
// RAR15 did not use the special dictionary size to mark dirs.
272-
if (hd->UnpVer<20 && (hd->FileAttr & 0x10)!=0)
273-
hd->Dir=true;
274-
275271
hd->Method=Raw.Get1()-0x30;
276272
size_t NameSize=Raw.Get2();
277273
hd->FileAttr=Raw.Get4();
278274

275+
// RAR15 did not use the special dictionary size to mark dirs.
276+
if (hd->UnpVer<20 && (hd->FileAttr & 0x10)!=0)
277+
hd->Dir=true;
278+
279279
hd->CryptMethod=CRYPT_NONE;
280280
if (hd->Encrypted)
281281
switch(hd->UnpVer)
@@ -402,8 +402,8 @@ size_t Archive::ReadHeader15()
402402
if (rmode & 4)
403403
rlt.Second++;
404404
rlt.Reminder=0;
405-
int count=rmode&3;
406-
for (int J=0;J<count;J++)
405+
uint count=rmode&3;
406+
for (uint J=0;J<count;J++)
407407
{
408408
byte CurByte=Raw.Get1();
409409
rlt.Reminder|=(((uint)CurByte)<<((J+3-count)*8));
@@ -521,7 +521,6 @@ size_t Archive::ReadHeader15()
521521
{
522522
// Last 7 bytes of recovered volume can contain zeroes, because
523523
// REV files store its own information (volume number, etc.) here.
524-
SaveFilePos SavePos(*this);
525524
int64 Length=Tell();
526525
Seek(Length-7,SEEK_SET);
527526
Recovered=true;
@@ -584,7 +583,7 @@ size_t Archive::ReadHeader50()
584583
{
585584
// This message is used by Android GUI to reset cached passwords.
586585
// Update appropriate code if changed.
587-
uiMsg(UIERROR_BADPSW,FileName);
586+
uiMsg(UIERROR_BADPSW,FileName,FileName);
588587
FailedHeaderDecryption=true;
589588
ErrHandler.SetErrorCode(RARX_BADPWD);
590589
return 0;
@@ -593,7 +592,7 @@ size_t Archive::ReadHeader50()
593592
{
594593
// This message is used by Android GUI and Windows GUI and SFX to
595594
// reset cached passwords. Update appropriate code if changed.
596-
uiMsg(UIWAIT_BADPSW,FileName);
595+
uiMsg(UIWAIT_BADPSW,FileName,FileName);
597596
Cmd->Password.Clean();
598597
}
599598

@@ -720,6 +719,7 @@ size_t Archive::ReadHeader50()
720719
UnkEncVerMsg(FileName,Info);
721720
return 0;
722721
}
722+
723723
Raw.GetB(CryptHead.Salt,SIZE_SALT50);
724724
if (CryptHead.UsePswCheck)
725725
{
@@ -785,7 +785,7 @@ size_t Archive::ReadHeader50()
785785
case HEAD_SERVICE:
786786
{
787787
FileHeader *hd=ShortBlock.HeaderType==HEAD_FILE ? &FileHead:&SubHead;
788-
hd->Reset();
788+
hd->Reset(); // Clear hash, time fields and other stuff like flags.
789789
*(BaseBlock *)hd=ShortBlock;
790790

791791
bool FileBlock=ShortBlock.HeaderType==HEAD_FILE;
@@ -1256,11 +1256,13 @@ size_t Archive::ReadHeader14()
12561256
Raw.Read(NameSize);
12571257

12581258
char FileName[NM];
1259-
Raw.GetB((byte *)FileName,Min(NameSize,ASIZE(FileName)));
1260-
FileName[NameSize]=0;
1259+
size_t ReadNameSize=Min(NameSize,ASIZE(FileName)-1);
1260+
Raw.GetB((byte *)FileName,ReadNameSize);
1261+
FileName[ReadNameSize]=0;
12611262
IntToExt(FileName,FileName,ASIZE(FileName));
12621263
CharToWide(FileName,FileHead.FileName,ASIZE(FileHead.FileName));
12631264
ConvertNameCase(FileHead.FileName);
1265+
ConvertFileHeader(&FileHead);
12641266

12651267
if (Raw.Size()!=0)
12661268
NextBlockPos=CurBlockPos+FileHead.HeadSize+FileHead.PackSize;
@@ -1414,7 +1416,7 @@ int64 Archive::GetStartPos()
14141416
}
14151417

14161418

1417-
bool Archive::ReadSubData(Array<byte> *UnpData,File *DestFile)
1419+
bool Archive::ReadSubData(Array<byte> *UnpData,File *DestFile,bool TestMode)
14181420
{
14191421
if (BrokenHeader)
14201422
{
@@ -1462,6 +1464,7 @@ bool Archive::ReadSubData(Array<byte> *UnpData,File *DestFile)
14621464
SubDataIO.SetPackedSizeToRead(SubHead.PackSize);
14631465
SubDataIO.EnableShowProgress(false);
14641466
SubDataIO.SetFiles(this,DestFile);
1467+
SubDataIO.SetTestMode(TestMode);
14651468
SubDataIO.UnpVolume=SubHead.SplitAfter;
14661469
SubDataIO.SetSubHeader(&SubHead,NULL);
14671470
Unpack.SetDestSize(SubHead.UnpSize);

blake2s.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#define _RAR_BLAKE2_
44

55
#define BLAKE2_DIGEST_SIZE 32
6+
#define BLAKE2_THREADS_NUMBER 8
67

78
enum blake2s_constant
89
{

0 commit comments

Comments
 (0)