summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Wildemann <metalstrolch@users.noreply.github.com>2019-10-18 10:27:44 +0200
committerGitHub <noreply@github.com>2019-10-18 10:27:44 +0200
commit6c16e5a752d088db6c0714834ae1723b02d2c127 (patch)
treef5607a04c1e1e8f639755dafa09e7ea1bb70907c
parent49b7f6d2580d2b2ec0609d740495da304e90363e (diff)
downloadnavit-6c16e5a752d088db6c0714834ae1723b02d2c127.tar.gz
fix:maptool:create valid zip64 central directory (#915)
This fixes the zip64 central directory created by the maptool. While the broken one works on navit itselve, it failed to extract with usual zip tools due to parts of the zip64 end of directory part not being filled correctly with values.
-rw-r--r--navit/maptool/zip.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/navit/maptool/zip.c b/navit/maptool/zip.c
index 33fcab6c0..2538e2e3b 100644
--- a/navit/maptool/zip.c
+++ b/navit/maptool/zip.c
@@ -230,18 +230,28 @@ int zip_write_directory(struct zip_info *info) {
zip_write_file_data(info, info->dir);
if (info->zip64) {
eoc64.zip64esize=sizeof(eoc64)-12;
+ eoc64.zip64ever=0x031e; /* UNIX, spec 3.0 */
+ eoc64.zip64eneed=0x002d; /* version 4.5 for zip64*/
eoc64.zip64enum=info->zipnum;
eoc64.zip64ecenn=info->zipnum;
eoc64.zip64ecsz=info->dir_size;
eoc64.zip64eofst=info->offset;
zip_write(info, &eoc64, sizeof(eoc64));
eocl.zip64lofst=info->offset+info->dir_size;
+ eocl.zip74lnum=1; /* we only have single disk archives. */
zip_write(info, &eocl, sizeof(eocl));
+
+ /* force to use the 64 bit values */
+ eoc.zipenum=0xFFFF;
+ eoc.zipecenn=0xFFFF;
+ eoc.zipecsz=0xFFFFFFFF;
+ eoc.zipeofst=0xFFFFFFFF;
+ } else {
+ eoc.zipenum=info->zipnum;
+ eoc.zipecenn=info->zipnum;
+ eoc.zipecsz=info->dir_size;
+ eoc.zipeofst=info->offset;
}
- eoc.zipenum=info->zipnum;
- eoc.zipecenn=info->zipnum;
- eoc.zipecsz=info->dir_size;
- eoc.zipeofst=info->offset;
zip_write(info, &eoc, sizeof(eoc));
sig_alrm(0);
#ifndef _WIN32