summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWildemann Stefan <stefan.wildemann@corpuls.com>2019-10-17 11:26:51 +0200
committerWildemann Stefan <stefan.wildemann@corpuls.com>2019-10-17 11:29:58 +0200
commit5681c7da7111f95090bfdacc2ac02f9b6cf2c937 (patch)
tree4ab3363b0d5e439313044ab6fdc7405ffec46b47
parentb8355b608467a06f579dcf61c5c2d0b43ae5649b (diff)
downloadnavit-5681c7da7111f95090bfdacc2ac02f9b6cf2c937.tar.gz
fix:maptool:create falid zi64 central directory
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