git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: What's cooking in git.git (Apr 2017, #06; Wed, 26)

From
René Scharfe <l.s.r@web.de>
Date
Apr 27, 2017, 20:25 UTC
Message-ID
<a7545d98-7203-7bd6-faa2-9bb1e718539a@web.de>
In-Reply-To
<xmqqfugupnk3.fsf@gitster.mtv.corp.google.com>
Am 27.04.2017 um 04:54 schrieb Junio C Hamano:
Show 12 quoted lines
> * rs/large-zip (2017-04-24) 5 commits
>    (merged to 'next' on 2017-04-26 at a6beab60f2)
>   + archive-zip: support files bigger than 4GB
>   + archive-zip: support archives bigger than 4GB
>   + archive-zip: write ZIP dir entry directly to strbuf
>   + archive-zip: use strbuf for ZIP directory
>   + archive-zip: add tests for big ZIP archives
> 
>   "git archive --format=zip" learned to use zip64 extension when
>   necessary to go beyond the 4GB limit.
> 
>   Will merge to 'master'.
Woah, that was quick.  We need this fix on top:
-- >8 --
Subject: [PATCH] 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>
---
 archive-zip.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/archive-zip.c b/archive-zip.c
index 44ed78f163..e81c5ac15a 100644
--- a/archive-zip.c
+++ b/archive-zip.c
@@ -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);
-- 
2.12.2
Previous: Junio C Hamano
Message 2 of 2 in “What's cooking in git.git (Apr 2017, #06; Wed, 26)”
  1. Junio C HamanoApr 27, 2017
  2. René ScharfeApr 27, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.