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);