Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/rarfilesource.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOctaneSnail <os@v12pwr.com>2008-12-13 21:54:51 +0300
committerOctaneSnail <os@v12pwr.com>2008-12-13 22:54:08 +0300
commit0978b5dd252cfdfed9813af201d634aa9e79d949 (patch)
tree9b1e7b457c1ddca08146682a7a2f1502d836deae /RAR.cpp
parent75ed77126304e38d098fc4f5845e552a48999734 (diff)
Fix handling of archives and media files larger than 4 gigabytes.
Based on a patch from OV2.
Diffstat (limited to 'RAR.cpp')
-rw-r--r--RAR.cpp44
1 files changed, 20 insertions, 24 deletions
diff --git a/RAR.cpp b/RAR.cpp
index fb659f3..310c2e3 100644
--- a/RAR.cpp
+++ b/RAR.cpp
@@ -44,7 +44,8 @@ DWORD ReadHeader (HANDLE file, rar_header_t *dest)
{
fixed_header_t fh;
fixed_file_header_t ffh;
- DWORD read, acc = 0, dword;
+ DWORD read, dword;
+ LONGLONG acc = 0;
// Read fixed archive header.
READ_ITEM (fh);
@@ -56,16 +57,13 @@ DWORD ReadHeader (HANDLE file, rar_header_t *dest)
if (fh.flags & LONG_BLOCK)
{
READ_ITEM (dword);
-
- if ((MAXDWORD - dword) < fh.size)
- {
- ErrorMsg (0, L"Variable overflow while reading RAR header.");
- return S_FALSE;
- }
- dest->ch.size = dword + fh.size;
+ dest->ch.size.QuadPart = (LONGLONG) dword + fh.size;
}
else
- dest->ch.size = fh.size;
+ {
+ dest->ch.size.HighPart = 0;
+ dest->ch.size.LowPart = fh.size;
+ }
switch (fh.type)
{
@@ -76,7 +74,7 @@ DWORD ReadHeader (HANDLE file, rar_header_t *dest)
case HEADER_TYPE_FILE:
READ_ITEM (ffh);
- dest->fh.low_size = ffh.size;
+ dest->fh.size.LowPart = ffh.size;
dest->fh.os = ffh.os;
dest->fh.crc = ffh.crc;
dest->fh.timestamp = ffh.timestamp;
@@ -87,16 +85,13 @@ DWORD ReadHeader (HANDLE file, rar_header_t *dest)
if (fh.flags & LHD_LARGE)
{
- READ_ITEM (dword);
- dest->fh.high_size = dword;
- dest->fh.size = ((DWORD64) dword << 32) | ffh.size;
- READ_ITEM (dword);
+ READ_ITEM (dword); // Packed size high dword
+ dest->ch.size.HighPart += dword;
+ READ_ITEM (dword); // Unpacked size high dword
+ dest->fh.size.HighPart = dword;
}
else
- {
- dest->fh.high_size = 0;
- dest->fh.size = ffh.size;
- }
+ dest->fh.size.HighPart = 0;
dest->fh.filename = new char [dest->fh.name_len + 1];
if (!dest->fh.filename)
@@ -136,20 +131,21 @@ DWORD ReadHeader (HANDLE file, rar_header_t *dest)
}
}
- if (acc > dest->ch.size)
+ if (acc > dest->ch.size.QuadPart)
{
ErrorMsg (0, L"Overrun while reading RAR header.");
return S_FALSE;
}
- if (fh.type != HEADER_TYPE_FILE && acc < dest->ch.size)
+ if (fh.type != HEADER_TYPE_FILE && acc < dest->ch.size.QuadPart)
{
- SetFilePointer (file, dest->ch.size - acc, 0, FILE_CURRENT);
-// DbgLog ((LOG_TRACE, 2, L"Skipped over %d header bytes.", dest->ch.size - acc));
- dest->bytesRemaining = 0;
+ LARGE_INTEGER li;
+ li.QuadPart = dest->ch.size.QuadPart - acc;
+ SetFilePointerEx (file, li, NULL, FILE_CURRENT);
+ dest->bytesRemaining.QuadPart = 0;
}
else
- dest->bytesRemaining = dest->ch.size - acc;
+ dest->bytesRemaining.QuadPart = dest->ch.size.QuadPart - acc;
return ERROR_SUCCESS;
}