archive-zip: set version field for big files correctly
authorRené Scharfe <l.s.r@web.de>
Thu, 27 Apr 2017 20:25:45 +0000 (22:25 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 28 Apr 2017 01:07:59 +0000 (10:07 +0900)
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>
archive-zip.c
index 44ed78f163e38449862663bf89153945e274a6c5..e81c5ac15a05d7d333005ff85fca767740693fc7 100644 (file)
@@ -298,6 +298,7 @@ static int write_zip_entry(struct archiver_args *args,
        int is_binary = -1;
        const char *path_without_prefix = path + args->baselen;
        unsigned int creator_version = 0;
+       unsigned int version_needed = 10;
        size_t zip_dir_extra_size = ZIP_EXTRA_MTIME_SIZE;
        size_t zip64_dir_extra_payload_size = 0;
 
@@ -382,8 +383,11 @@ static int write_zip_entry(struct archiver_args *args,
        if (stream && size > 0x7fffffff)
                need_zip64_extra = 1;
 
+       if (need_zip64_extra)
+               version_needed = 45;
+
        copy_le32(header.magic, 0x04034b50);
-       copy_le16(header.version, 10);
+       copy_le16(header.version, version_needed);
        copy_le16(header.flags, flags);
        copy_le16(header.compression_method, method);
        copy_le16(header.mtime, zip_time);
@@ -509,7 +513,7 @@ static int write_zip_entry(struct archiver_args *args,
 
        strbuf_add_le(&zip_dir, 4, 0x02014b50); /* magic */
        strbuf_add_le(&zip_dir, 2, creator_version);
-       strbuf_add_le(&zip_dir, 2, 10);         /* version */
+       strbuf_add_le(&zip_dir, 2, version_needed);
        strbuf_add_le(&zip_dir, 2, flags);
        strbuf_add_le(&zip_dir, 2, method);
        strbuf_add_le(&zip_dir, 2, zip_time);