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>
This commit is contained in:
René Scharfe 2017-04-27 22:25:45 +02:00 коммит произвёл Junio C Hamano
Родитель 4cdf3f9d84
Коммит ebdfa294c9
1 изменённых файлов: 6 добавлений и 2 удалений

Просмотреть файл

@ -298,6 +298,7 @@ static int write_zip_entry(struct archiver_args *args,
int is_binary = -1; int is_binary = -1;
const char *path_without_prefix = path + args->baselen; const char *path_without_prefix = path + args->baselen;
unsigned int creator_version = 0; unsigned int creator_version = 0;
unsigned int version_needed = 10;
size_t zip_dir_extra_size = ZIP_EXTRA_MTIME_SIZE; size_t zip_dir_extra_size = ZIP_EXTRA_MTIME_SIZE;
size_t zip64_dir_extra_payload_size = 0; 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) if (stream && size > 0x7fffffff)
need_zip64_extra = 1; need_zip64_extra = 1;
if (need_zip64_extra)
version_needed = 45;
copy_le32(header.magic, 0x04034b50); copy_le32(header.magic, 0x04034b50);
copy_le16(header.version, 10); copy_le16(header.version, version_needed);
copy_le16(header.flags, flags); copy_le16(header.flags, flags);
copy_le16(header.compression_method, method); copy_le16(header.compression_method, method);
copy_le16(header.mtime, zip_time); 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, 4, 0x02014b50); /* magic */
strbuf_add_le(&zip_dir, 2, creator_version); 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, flags);
strbuf_add_le(&zip_dir, 2, method); strbuf_add_le(&zip_dir, 2, method);
strbuf_add_le(&zip_dir, 2, zip_time); strbuf_add_le(&zip_dir, 2, zip_time);