View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0000549 | Plugins | MultiArc (old) | public | 2008-06-09 02:39 | 2008-06-09 06:55 |
| Reporter | DiRTy_GaRRy | Assigned To | alexy | ||
| Priority | normal | Severity | minor | Reproducibility | always |
| Status | closed | Resolution | fixed | ||
| Platform | x86 | OS | Windows | OS Version | 2003 SP2 |
| Product Version | 1.71 | ||||
| Fixed in Version | 1.71 | ||||
| Summary | 0000549: Zip.fmt не поддерживает zip архивы размером более 2Гб | ||||
| Description | Zip.fmt не поддерживает просмотр листинга для zip-архивов размером более 2Гб. Появляется ошибка о неожиданном конце файла. Патч прилагаю. | ||||
| Tags | No tags attached. | ||||
|
2008-06-09 02:39
|
zip.patch (4,942 bytes)
Index: plugins/multiarc/zip.cpp
===================================================================
--- plugins/multiarc/zip.cpp (revision 1774)
+++ plugins/multiarc/zip.cpp (working copy)
@@ -4,7 +4,7 @@
Second-level plugin module for FAR Manager and MultiArc plugin
Copyright (c) 1996-2000 Eugene Roshal
- Copyrigth (c) 2000-2006 FAR group
+ Copyrigth (c) 2000-2008 FAR group
*/
#include <windows.h>
@@ -58,9 +58,18 @@
#endif
*/
+union _DWORD64
+{
+ DWORD64 Value;
+ struct
+ {
+ DWORD Low;
+ DWORD High;
+ };
+};
static HANDLE ArcHandle;
-static DWORD SFXSize,NextPosition,FileSize;
+static _DWORD64 SFXSize,NextPosition,FileSize;
static int ArcComment,Truncated,FirstRecord;
struct ZipHeader
@@ -96,7 +105,7 @@
{
if (DataSize>=4 && Data[0]=='P' && Data[1]=='K' && Data[2]==5 && Data[3]==6)
{
- SFXSize=0;
+ SFXSize.Value=0;
return(TRUE);
}
if (DataSize<(int)MIN_HEADER_LEN) return FALSE;
@@ -106,7 +115,7 @@
{
if (IsValidHeader(CurData, DataEnd))
{
- SFXSize=(DWORD)(CurData-Data);
+ SFXSize.Value=(DWORD)(CurData-Data);
return(TRUE);
}
}
@@ -125,35 +134,43 @@
ArcComment=FALSE;
FirstRecord=TRUE;
- FileSize=GetFileSize(ArcHandle,NULL);
+ FileSize.Low=GetFileSize(ArcHandle,&FileSize.High);
+ if (FileSize.Low==(DWORD)INVALID_HANDLE_VALUE && GetLastError()!=ERROR_SUCCESS)
+ return(FALSE);
char ReadBuf[1024];
- DWORD CurPos,ReadSize;
+ _DWORD64 CurPos; CurPos.Value=0;
+ DWORD ReadSize;
int Buf,Found=0;
- CurPos=NextPosition=SetFilePointer(ArcHandle,0,NULL,FILE_END);
- if (CurPos<sizeof(ReadBuf)-18)
- CurPos=0;
+ CurPos.Low=SetFilePointer(ArcHandle,0,(PLONG)&CurPos.High,FILE_END);
+ NextPosition=CurPos;
+ if (CurPos.Value<sizeof(ReadBuf)-18)
+ CurPos.Value=0;
else
- CurPos-=sizeof(ReadBuf)-18;
+ CurPos.Value-=sizeof(ReadBuf)-18;
for (Buf=0;Buf<64 && !Found;Buf++)
{
- SetFilePointer(ArcHandle,CurPos,NULL,FILE_BEGIN);
+ _DWORD64 CurPosTemp=CurPos;
+ SetFilePointer(ArcHandle,CurPosTemp.Low,(PLONG)&CurPosTemp.High,FILE_BEGIN);
ReadFile(ArcHandle,ReadBuf,sizeof(ReadBuf),&ReadSize,NULL);
for (int I=ReadSize-4;I>=0;I--)
if (ReadBuf[I]==0x50 && ReadBuf[I+1]==0x4b && ReadBuf[I+2]==0x05 &&
ReadBuf[I+3]==0x06)
{
- SetFilePointer(ArcHandle,CurPos+I+16,NULL,FILE_BEGIN);
- ReadFile(ArcHandle,&NextPosition,sizeof(NextPosition),&ReadSize,NULL);
+ CurPosTemp=CurPos;
+ CurPosTemp.Value+=I+16;
+ SetFilePointer(ArcHandle,CurPosTemp.Low,(PLONG)&CurPosTemp.High,FILE_BEGIN);
+ ReadFile(ArcHandle,&NextPosition.Low,sizeof(NextPosition.Low),&ReadSize,NULL);
+ NextPosition.High = 0;
Found=TRUE;
break;
}
- if (CurPos==0)
+ if (CurPos.Value==0)
break;
- if (CurPos<sizeof(ReadBuf)-4)
- CurPos=0;
+ if (CurPos.Value<sizeof(ReadBuf)-4)
+ CurPos.Value=0;
else
- CurPos-=sizeof(ReadBuf)-4;
+ CurPos.Value-=sizeof(ReadBuf)-4;
}
Truncated=!Found;
if (Truncated)
@@ -203,10 +220,10 @@
DWORD ReadSize;
- NextPosition=SetFilePointer(ArcHandle,NextPosition,NULL,FILE_BEGIN);
- if (NextPosition==0xFFFFFFFF)
+ NextPosition.Low=SetFilePointer(ArcHandle,NextPosition.Low,(PLONG)&NextPosition.High,FILE_BEGIN);
+ if (NextPosition.Low==(DWORD)INVALID_SET_FILE_POINTER && GetLastError()!=ERROR_SUCCESS)
return(GETARC_READERROR);
- if (NextPosition>FileSize)
+ if (NextPosition.Value>FileSize.Value)
return(GETARC_UNEXPEOF);
if (Truncated)
{
@@ -230,10 +247,11 @@
{
if (FirstRecord)
{
- if (SFXSize>0)
+ if (SFXSize.Value>0)
{
- NextPosition+=SFXSize;
- SetFilePointer(ArcHandle,NextPosition,NULL,FILE_BEGIN);
+ NextPosition.Value+=SFXSize.Value;
+ _DWORD64 NextPositionTemp=NextPosition;
+ SetFilePointer(ArcHandle,NextPositionTemp.Low,(PLONG)&NextPositionTemp.High,FILE_BEGIN);
if (!ReadFile(ArcHandle,&ZipHeader,sizeof(ZipHeader),&ReadSize,NULL))
return(GETARC_READERROR);
}
@@ -400,7 +418,7 @@
long SeekLen=0;
if (Truncated)
SeekLen+=ZipHeader.PackSize;
- NextPosition=SetFilePointer(ArcHandle,SeekLen,NULL,FILE_CURRENT);
+ NextPosition.Low=SetFilePointer(ArcHandle,SeekLen,(PLONG)&NextPosition.High,FILE_CURRENT);
return(GETARC_SUCCESS);
}
@@ -410,7 +428,7 @@
{
if(Info)
{
- Info->SFXSize=SFXSize;
+ Info->SFXSize=SFXSize.Value;
Info->Comment=ArcComment;
}
return(CloseHandle(ArcHandle));
@@ -418,7 +436,7 @@
DWORD WINAPI _export GetSFXPos(void)
{
- return SFXSize;
+ return SFXSize.Value;
}
BOOL WINAPI _export GetFormatName(int Type,char *FormatName,char *DefaultExt)
|
|
|
я маленько перелопатил щоб сильно по 9x не било :) Проверяй на svn(zip 1.30) |
|
|
Вроде, работает. А про 9x я уже давно перестал задумываться. ;-) |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2008-06-09 02:39 | DiRTy_GaRRy | New Issue | |
| 2008-06-09 02:39 | DiRTy_GaRRy | File Added: zip.patch | |
| 2008-06-09 03:39 | alexy | Status | new => assigned |
| 2008-06-09 03:39 | alexy | Assigned To | => alexy |
| 2008-06-09 06:32 | alexy | Note Added: 0001565 | |
| 2008-06-09 06:32 | alexy | Status | assigned => feedback |
| 2008-06-09 06:44 | DiRTy_GaRRy | Note Added: 0001566 | |
| 2008-06-09 06:44 | DiRTy_GaRRy | Status | feedback => resolved |
| 2008-06-09 06:44 | DiRTy_GaRRy | Resolution | open => fixed |
| 2008-06-09 06:55 | alexy | Status | resolved => closed |
| 2008-06-09 06:55 | alexy | Fixed in Version | => 1.71 |
| 2013-05-20 20:38 | alexy | Category | MultiArc => MultiArc (old) |