diff options
author | Stefan Wildemann <metalstrolch@users.noreply.github.com> | 2019-10-18 10:27:44 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-18 10:27:44 +0200 |
commit | 6c16e5a752d088db6c0714834ae1723b02d2c127 (patch) | |
tree | f5607a04c1e1e8f639755dafa09e7ea1bb70907c | |
parent | 49b7f6d2580d2b2ec0609d740495da304e90363e (diff) | |
download | navit-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.c | 18 |
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 |