Browse Source

* Correct 64-bit zip files

git-svn-id: trunk@33337 -
michael 9 years ago
parent
commit
37da491e57
1 changed files with 7 additions and 10 deletions
  1. 7 10
      packages/paszlib/src/zipper.pp

+ 7 - 10
packages/paszlib/src/zipper.pp

@@ -1533,12 +1533,13 @@ Begin
     LocalHdr.Extra_Field_Length:=SizeOf(LocalZip64ExtHdr)+SizeOf(LocalZip64Fld);
     LocalHdr.Extra_Field_Length:=SizeOf(LocalZip64ExtHdr)+SizeOf(LocalZip64Fld);
   FOutStream.WriteBuffer({$IFDEF ENDIAN_BIG}SwapLFH{$ENDIF}(LocalHdr),SizeOf(LocalHdr));
   FOutStream.WriteBuffer({$IFDEF ENDIAN_BIG}SwapLFH{$ENDIF}(LocalHdr),SizeOf(LocalHdr));
   // Append extensible field header+zip64 extensible field if needed:
   // Append extensible field header+zip64 extensible field if needed:
+  FOutStream.WriteBuffer(ZFileName[1],Length(ZFileName));
   if IsZip64 then
   if IsZip64 then
   begin
   begin
+    LocalZip64ExtHdr.Header_ID:=ZIP64_HEADER_ID;
     FOutStream.WriteBuffer({$IFDEF ENDIAN_BIG}SwapEDFH{$ENDIF}(LocalZip64ExtHdr),SizeOf(LocalZip64ExtHdr));
     FOutStream.WriteBuffer({$IFDEF ENDIAN_BIG}SwapEDFH{$ENDIF}(LocalZip64ExtHdr),SizeOf(LocalZip64ExtHdr));
     FOutStream.WriteBuffer({$IFDEF ENDIAN_BIG}SwapZ64EIF{$ENDIF}(LocalZip64Fld),SizeOf(LocalZip64Fld));
     FOutStream.WriteBuffer({$IFDEF ENDIAN_BIG}SwapZ64EIF{$ENDIF}(LocalZip64Fld),SizeOf(LocalZip64Fld));
   end;
   end;
-  FOutStream.WriteBuffer(ZFileName[1],Length(ZFileName));
 End;
 End;
 
 
 
 
@@ -1596,8 +1597,7 @@ Begin
       // Move past extra fields
       // Move past extra fields
       FOutStream.Seek(SavePos+LocalHdr.Extra_Field_Length,soFromBeginning);
       FOutStream.Seek(SavePos+LocalHdr.Extra_Field_Length,soFromBeginning);
       end;
       end;
-      SavePos := FOutStream.Position;
-
+    SavePos := FOutStream.Position;
     FillChar(CentralHdr,SizeOf(CentralHdr),0);
     FillChar(CentralHdr,SizeOf(CentralHdr),0);
     With CentralHdr do
     With CentralHdr do
       begin
       begin
@@ -1657,7 +1657,7 @@ Begin
 
 
     Inc(ACount);
     Inc(ACount);
     // Move past compressed file data to next header:
     // Move past compressed file data to next header:
-    if LocalHdr.Compressed_Size=$FFFFFFFF then
+    if Iszip64 then
       FOutStream.Seek(SavePos + LocalZip64Fld.Compressed_Size,soBeginning)
       FOutStream.Seek(SavePos + LocalZip64Fld.Compressed_Size,soBeginning)
     else
     else
       FOutStream.Seek(SavePos + LocalHdr.Compressed_Size,soBeginning);
       FOutStream.Seek(SavePos + LocalHdr.Compressed_Size,soBeginning);
@@ -1666,7 +1666,8 @@ Begin
   {$IFDEF FPC_BIG_ENDIAN}
   {$IFDEF FPC_BIG_ENDIAN}
     LocalHdr := SwapLFH(LocalHdr);
     LocalHdr := SwapLFH(LocalHdr);
   {$ENDIF}
   {$ENDIF}
-  Until LocalHdr.Signature = CENTRAL_FILE_HEADER_SIGNATURE;
+  Until LocalHdr.Signature = CENTRAL_FILE_HEADER_SIGNATURE ;
+
   FOutStream.Seek(0,soEnd);
   FOutStream.Seek(0,soEnd);
   FillChar(EndHdr,SizeOf(EndHdr),0);
   FillChar(EndHdr,SizeOf(EndHdr),0);
 
 
@@ -1832,14 +1833,11 @@ Var
   I : integer; //could be qword but limited by FEntries.Count
   I : integer; //could be qword but limited by FEntries.Count
 begin
 begin
   FOutStream := AStream;
   FOutStream := AStream;
-
   If CheckEntries=0 then
   If CheckEntries=0 then
     Exit;
     Exit;
-
   FZipping:=True;
   FZipping:=True;
   Try
   Try
     GetFileInfo; //get info on file entries in zip
     GetFileInfo; //get info on file entries in zip
-
     for I:=0 to FEntries.Count-1 do
     for I:=0 to FEntries.Count-1 do
       ZipOneFile(FEntries[i]);
       ZipOneFile(FEntries[i]);
     if FEntries.Count>0 then
     if FEntries.Count>0 then
@@ -2787,8 +2785,7 @@ begin
 end;
 end;
 
 
 procedure TZipFileEntry.SetArchiveFileName(const AValue: String);
 procedure TZipFileEntry.SetArchiveFileName(const AValue: String);
-var
-  Separator: char;
+
 begin
 begin
   if FArchiveFileName=AValue then Exit;
   if FArchiveFileName=AValue then Exit;
   // Zip standard: filenames inside the zip archive have / path separator
   // Zip standard: filenames inside the zip archive have / path separator