archive-zip: set version field for big files correctly

Signal that extractors need to implement spec version 4.5 (or higher) for files with sizes of 4GB and more. Older unzippers might produce truncated results otherwise; they should rather refuse to extract. Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed Apr 27, 2017 at 22:25 UTC ebdfa294c9e280ee14de27cf9d4ffb2cf82d2f36
1 file changed +6 -2
archive-zip.c
+6 -2
@@ -298,6 +298,7 @@ static int write_zip_entry(struct archiver_args *args,
298 int is_binary = -1;
299 const char *path_without_prefix = path + args->baselen;
300 unsigned int creator_version = 0;
301 + unsigned int version_needed = 10;
302 size_t zip_dir_extra_size = ZIP_EXTRA_MTIME_SIZE;
303 size_t zip64_dir_extra_payload_size = 0;
304
@@ -382,8 +383,11 @@ static int write_zip_entry(struct archiver_args *args,
383 if (stream && size > 0x7fffffff)
384 need_zip64_extra = 1;
385
386 + if (need_zip64_extra)
387 + version_needed = 45;
388 +
389 copy_le32(header.magic, 0x04034b50);
386 - copy_le16(header.version, 10);
390 + copy_le16(header.version, version_needed);
391 copy_le16(header.flags, flags);
392 copy_le16(header.compression_method, method);
393 copy_le16(header.mtime, zip_time);
@@ -509,7 +513,7 @@ static int write_zip_entry(struct archiver_args *args,
513
514 strbuf_add_le(&zip_dir, 4, 0x02014b50); /* magic */
515 strbuf_add_le(&zip_dir, 2, creator_version);
512 - strbuf_add_le(&zip_dir, 2, 10); /* version */
516 + strbuf_add_le(&zip_dir, 2, version_needed);
517 strbuf_add_le(&zip_dir, 2, flags);
518 strbuf_add_le(&zip_dir, 2, method);
519 strbuf_add_le(&zip_dir, 2, zip_time);