From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Mon, 17 Sep 2018 13:11:42 +0000 (-0700) Subject: bpo-34341: Fix appending to ZIP archives with the ZIP64 extension. (GH-8683) X-Git-Tag: v3.6.7rc1~31 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=83a0985165abf340294c10d732840e9d46ba218c;p=thirdparty%2FPython%2Fcpython.git bpo-34341: Fix appending to ZIP archives with the ZIP64 extension. (GH-8683) (cherry picked from commit 9bdb7be482aef8f60daa1d36606568a132dcb616) Co-authored-by: Serhiy Storchaka --- diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index d09ad96fc8ba..e62b82e1d31d 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -718,6 +718,20 @@ class StoredTestZip64InSmallFiles(AbstractTestZip64InSmallFiles, with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_STORED) as zipfp: self.assertEqual(zipfp.namelist(), ["absolute"]) + def test_append(self): + # Test that appending to the Zip64 archive doesn't change + # extra fields of existing entries. + with zipfile.ZipFile(TESTFN2, "w", allowZip64=True) as zipfp: + zipfp.writestr("strfile", self.data) + with zipfile.ZipFile(TESTFN2, "r", allowZip64=True) as zipfp: + zinfo = zipfp.getinfo("strfile") + extra = zinfo.extra + with zipfile.ZipFile(TESTFN2, "a", allowZip64=True) as zipfp: + zipfp.writestr("strfile2", self.data) + with zipfile.ZipFile(TESTFN2, "r", allowZip64=True) as zipfp: + zinfo = zipfp.getinfo("strfile") + self.assertEqual(zinfo.extra, extra) + @requires_zlib class DeflateTestZip64InSmallFiles(AbstractTestZip64InSmallFiles, unittest.TestCase): diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 9164f8ab086a..bc757a37b5c4 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -164,6 +164,27 @@ _CD64_NUMBER_ENTRIES_TOTAL = 7 _CD64_DIRECTORY_SIZE = 8 _CD64_OFFSET_START_CENTDIR = 9 +_EXTRA_FIELD_STRUCT = struct.Struct('