Revert "Remove all ZIP64LIMIT hack"

This reverts commit 37a4290909.

Reason for revert: b/278156419

Change-Id: I67ea667619a9623be849d911993010ef0f0bfd88
This commit is contained in:
Kelvin Zhang 2023-04-14 21:32:54 +00:00 committed by Gerrit Code Review
parent 37a4290909
commit f92f7f046a
9 changed files with 101 additions and 67 deletions

View file

@ -842,13 +842,14 @@ def ReplaceUpdatedFiles(zip_filename, files_list):
SYSTEM/ after rebuilding recovery.
"""
common.ZipDelete(zip_filename, files_list)
with zipfile.ZipFile(zip_filename, "a",
output_zip = zipfile.ZipFile(zip_filename, "a",
compression=zipfile.ZIP_DEFLATED,
allowZip64=True) as output_zip:
allowZip64=True)
for item in files_list:
file_path = os.path.join(OPTIONS.input_tmp, item)
assert os.path.exists(file_path)
common.ZipWrite(output_zip, file_path, arcname=item)
common.ZipClose(output_zip)
def HasPartition(partition_name):
@ -1175,7 +1176,7 @@ def AddImagesToTargetFiles(filename):
AddVbmetaDigest(output_zip)
if output_zip:
output_zip.close()
common.ZipClose(output_zip)
if OPTIONS.replace_updated_files_list:
ReplaceUpdatedFiles(output_zip.filename,
OPTIONS.replace_updated_files_list)

View file

@ -415,7 +415,7 @@ def SignUncompressedApex(avbtool, apex_file, payload_key, container_key,
apex_zip = zipfile.ZipFile(apex_file, 'a', allowZip64=True)
common.ZipWrite(apex_zip, payload_file, arcname=APEX_PAYLOAD_IMAGE)
common.ZipWrite(apex_zip, payload_public_key, arcname=APEX_PUBKEY)
apex_zip.close()
common.ZipClose(apex_zip)
# 3. Sign the APEX container with container_key.
signed_apex = common.MakeTempFile(prefix='apex-container-', suffix='.apex')

View file

@ -142,7 +142,7 @@ def VerifyAbOtaPayload(cert, package):
"""Verifies the payload and metadata signatures in an A/B OTA payload."""
package_zip = zipfile.ZipFile(package, 'r', allowZip64=True)
if 'payload.bin' not in package_zip.namelist():
package_zip.close()
common.ZipClose(package_zip)
return
print('Verifying A/B OTA payload signatures...')
@ -160,7 +160,7 @@ def VerifyAbOtaPayload(cert, package):
'--in_file=' + payload_file,
'--public_key=' + pubkey]
common.RunAndCheckOutput(cmd)
package_zip.close()
common.ZipClose(package_zip)
# Verified successfully upon reaching here.
print('\nPayload signatures VERIFIED\n\n')

View file

@ -2797,6 +2797,18 @@ class PasswordManager(object):
def ZipWrite(zip_file, filename, arcname=None, perms=0o644,
compress_type=None):
# http://b/18015246
# Python 2.7's zipfile implementation wrongly thinks that zip64 is required
# for files larger than 2GiB. We can work around this by adjusting their
# limit. Note that `zipfile.writestr()` will not work for strings larger than
# 2GiB. The Python interpreter sometimes rejects strings that large (though
# it isn't clear to me exactly what circumstances cause this).
# `zipfile.write()` must be used directly to work around this.
#
# This mess can be avoided if we port to python3.
saved_zip64_limit = zipfile.ZIP64_LIMIT
zipfile.ZIP64_LIMIT = (1 << 32) - 1
if compress_type is None:
compress_type = zip_file.compression
if arcname is None:
@ -2822,13 +2834,14 @@ def ZipWrite(zip_file, filename, arcname=None, perms=0o644,
finally:
os.chmod(filename, saved_stat.st_mode)
os.utime(filename, (saved_stat.st_atime, saved_stat.st_mtime))
zipfile.ZIP64_LIMIT = saved_zip64_limit
def ZipWriteStr(zip_file, zinfo_or_arcname, data, perms=None,
compress_type=None):
"""Wrap zipfile.writestr() function to work around the zip64 limit.
Python's zip implementation won't allow writing a string
Even with the ZIP64_LIMIT workaround, it won't allow writing a string
longer than 2GiB. It gives 'OverflowError: size does not fit in an int'
when calling crc32(bytes).
@ -2837,6 +2850,9 @@ def ZipWriteStr(zip_file, zinfo_or_arcname, data, perms=None,
when we know the string won't be too long.
"""
saved_zip64_limit = zipfile.ZIP64_LIMIT
zipfile.ZIP64_LIMIT = (1 << 32) - 1
if not isinstance(zinfo_or_arcname, zipfile.ZipInfo):
zinfo = zipfile.ZipInfo(filename=zinfo_or_arcname)
zinfo.compress_type = zip_file.compression
@ -2869,6 +2885,7 @@ def ZipWriteStr(zip_file, zinfo_or_arcname, data, perms=None,
zinfo.date_time = (2009, 1, 1, 0, 0, 0)
zip_file.writestr(zinfo, data)
zipfile.ZIP64_LIMIT = saved_zip64_limit
def ZipDelete(zip_filename, entries, force=False):
@ -2902,6 +2919,18 @@ def ZipDelete(zip_filename, entries, force=False):
os.replace(new_zipfile, zip_filename)
def ZipClose(zip_file):
# http://b/18015246
# zipfile also refers to ZIP64_LIMIT during close() when it writes out the
# central directory.
saved_zip64_limit = zipfile.ZIP64_LIMIT
zipfile.ZIP64_LIMIT = (1 << 32) - 1
zip_file.close()
zipfile.ZIP64_LIMIT = saved_zip64_limit
class DeviceSpecificParams(object):
module = None

View file

@ -277,7 +277,7 @@ endif;
# We haven't written the metadata entry, which will be done in
# FinalizeMetadata.
output_zip.close()
common.ZipClose(output_zip)
needed_property_files = (
NonAbOtaPropertyFiles(),
@ -531,7 +531,7 @@ endif;
# We haven't written the metadata entry yet, which will be handled in
# FinalizeMetadata().
output_zip.close()
common.ZipClose(output_zip)
# Sign the generated zip package unless no_signing is specified.
needed_property_files = (

View file

@ -487,7 +487,7 @@ def GetTargetFilesZipForSecondaryImages(input_file, skip_postinstall=False):
else:
common.ZipWrite(target_zip, unzipped_file, arcname=info.filename)
target_zip.close()
common.ZipClose(target_zip)
return target_file
@ -624,7 +624,7 @@ def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions):
# TODO(xunchang) handle META/postinstall_config.txt'
partial_target_zip.close()
common.ZipClose(partial_target_zip)
return partial_target_file
@ -709,7 +709,7 @@ def GetTargetFilesZipForRetrofitDynamicPartitions(input_file,
# Write new ab_partitions.txt file
common.ZipWrite(target_zip, new_ab_partitions, arcname=AB_PARTITIONS)
target_zip.close()
common.ZipClose(target_zip)
return target_file
@ -1017,11 +1017,11 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None):
common.ZipWriteStr(output_zip, "apex_info.pb", ota_apex_info,
compress_type=zipfile.ZIP_STORED)
target_zip.close()
common.ZipClose(target_zip)
# We haven't written the metadata entry yet, which will be handled in
# FinalizeMetadata().
output_zip.close()
common.ZipClose(output_zip)
FinalizeMetadata(metadata, staging_file, output_file,
package_key=OPTIONS.package_key)

View file

@ -22,7 +22,7 @@ import zipfile
import ota_metadata_pb2
import common
from common import (ZipDelete, OPTIONS, MakeTempFile,
from common import (ZipDelete, ZipClose, OPTIONS, MakeTempFile,
ZipWriteStr, BuildInfo, LoadDictionaryFromFile,
SignFile, PARTITIONS_WITH_BUILD_PROP, PartitionBuildProps,
GetRamdiskFormat)

View file

@ -901,7 +901,7 @@ def WriteOtacerts(output_zip, filename, keys):
certs_zip = zipfile.ZipFile(temp_file, "w", allowZip64=True)
for k in keys:
common.ZipWrite(certs_zip, k)
certs_zip.close()
common.ZipClose(certs_zip)
common.ZipWriteStr(output_zip, filename, temp_file.getvalue())
@ -1529,8 +1529,8 @@ def main(argv):
platform_api_level, codename_to_api_level_map,
compressed_extension)
input_zip.close()
output_zip.close()
common.ZipClose(input_zip)
common.ZipClose(output_zip)
if OPTIONS.vendor_partitions and OPTIONS.vendor_otatools:
BuildVendorPartitions(args[1])

View file

@ -459,7 +459,7 @@ class CommonZipTest(test_utils.ReleaseToolsTestCase):
time.sleep(5) # Make sure the atime/mtime will change measurably.
common.ZipWrite(zip_file, test_file_name, **extra_zipwrite_args)
zip_file.close()
common.ZipClose(zip_file)
self._verify(zip_file, zip_file_name, arcname, sha1_hash.hexdigest(),
test_file_name, expected_stat, expected_mode,
@ -494,7 +494,7 @@ class CommonZipTest(test_utils.ReleaseToolsTestCase):
expected_mode = extra_args.get("perms", zinfo_perms)
common.ZipWriteStr(zip_file, zinfo_or_arcname, contents, **extra_args)
zip_file.close()
common.ZipClose(zip_file)
self._verify(zip_file, zip_file_name, arcname, sha1(contents).hexdigest(),
expected_mode=expected_mode,
@ -536,7 +536,7 @@ class CommonZipTest(test_utils.ReleaseToolsTestCase):
common.ZipWrite(zip_file, test_file_name, **extra_args)
common.ZipWriteStr(zip_file, arcname_small, small, **extra_args)
zip_file.close()
common.ZipClose(zip_file)
# Verify the contents written by ZipWrite().
self._verify(zip_file, zip_file_name, arcname_large,
@ -551,6 +551,12 @@ class CommonZipTest(test_utils.ReleaseToolsTestCase):
os.remove(zip_file_name)
os.remove(test_file_name)
def _test_reset_ZIP64_LIMIT(self, func, *args):
default_limit = (1 << 31) - 1
self.assertEqual(default_limit, zipfile.ZIP64_LIMIT)
func(*args)
self.assertEqual(default_limit, zipfile.ZIP64_LIMIT)
def test_ZipWrite(self):
file_contents = os.urandom(1024)
self._test_ZipWrite(file_contents)
@ -575,7 +581,7 @@ class CommonZipTest(test_utils.ReleaseToolsTestCase):
})
def test_ZipWrite_resets_ZIP64_LIMIT(self):
self._test_ZipWrite("")
self._test_reset_ZIP64_LIMIT(self._test_ZipWrite, "")
def test_ZipWriteStr(self):
random_string = os.urandom(1024)
@ -626,9 +632,9 @@ class CommonZipTest(test_utils.ReleaseToolsTestCase):
})
def test_ZipWriteStr_resets_ZIP64_LIMIT(self):
self._test_ZipWriteStr('foo', b'')
self._test_reset_ZIP64_LIMIT(self._test_ZipWriteStr, 'foo', b'')
zinfo = zipfile.ZipInfo(filename="foo")
self._test_ZipWriteStr(zinfo, b'')
self._test_reset_ZIP64_LIMIT(self._test_ZipWriteStr, zinfo, b'')
def test_bug21309935(self):
zip_file = tempfile.NamedTemporaryFile(delete=False)
@ -650,7 +656,7 @@ class CommonZipTest(test_utils.ReleaseToolsTestCase):
zinfo = zipfile.ZipInfo(filename="qux")
zinfo.external_attr = 0o700 << 16
common.ZipWriteStr(zip_file, zinfo, random_string, perms=0o400)
zip_file.close()
common.ZipClose(zip_file)
self._verify(zip_file, zip_file_name, "foo",
sha1(random_string).hexdigest(),
@ -677,7 +683,7 @@ class CommonZipTest(test_utils.ReleaseToolsTestCase):
common.ZipWrite(output_zip, entry_file.name, arcname='Test1')
common.ZipWrite(output_zip, entry_file.name, arcname='Test2')
common.ZipWrite(output_zip, entry_file.name, arcname='Test3')
output_zip.close()
common.ZipClose(output_zip)
zip_file.close()
try:
@ -725,8 +731,8 @@ class CommonZipTest(test_utils.ReleaseToolsTestCase):
common.ZipWrite(output_zip, entry_file.name, arcname='Foo3')
common.ZipWrite(output_zip, entry_file.name, arcname='Bar4')
common.ZipWrite(output_zip, entry_file.name, arcname='Dir5/Baz5')
output_zip.close()
output_zip.close()
common.ZipClose(output_zip)
common.ZipClose(output_zip)
return zip_file
@test_utils.SkipIfExternalToolsUnavailable()
@ -813,9 +819,9 @@ class CommonApkUtilsTest(test_utils.ReleaseToolsTestCase):
)
APKCERTS_CERTMAP1 = {
'RecoveryLocalizer.apk': 'certs/devkey',
'Settings.apk': 'build/make/target/product/security/platform',
'TV.apk': 'PRESIGNED',
'RecoveryLocalizer.apk' : 'certs/devkey',
'Settings.apk' : 'build/make/target/product/security/platform',
'TV.apk' : 'PRESIGNED',
}
APKCERTS_TXT2 = (
@ -830,10 +836,10 @@ class CommonApkUtilsTest(test_utils.ReleaseToolsTestCase):
)
APKCERTS_CERTMAP2 = {
'Compressed1.apk': 'certs/compressed1',
'Compressed2a.apk': 'certs/compressed2',
'Compressed2b.apk': 'certs/compressed2',
'Compressed3.apk': 'certs/compressed3',
'Compressed1.apk' : 'certs/compressed1',
'Compressed2a.apk' : 'certs/compressed2',
'Compressed2b.apk' : 'certs/compressed2',
'Compressed3.apk' : 'certs/compressed3',
}
APKCERTS_TXT3 = (
@ -842,7 +848,7 @@ class CommonApkUtilsTest(test_utils.ReleaseToolsTestCase):
)
APKCERTS_CERTMAP3 = {
'Compressed4.apk': 'certs/compressed4',
'Compressed4.apk' : 'certs/compressed4',
}
# Test parsing with no optional fields, both optional fields, and only the
@ -859,9 +865,9 @@ class CommonApkUtilsTest(test_utils.ReleaseToolsTestCase):
)
APKCERTS_CERTMAP4 = {
'RecoveryLocalizer.apk': 'certs/devkey',
'Settings.apk': 'build/make/target/product/security/platform',
'TV.apk': 'PRESIGNED',
'RecoveryLocalizer.apk' : 'certs/devkey',
'Settings.apk' : 'build/make/target/product/security/platform',
'TV.apk' : 'PRESIGNED',
}
def setUp(self):
@ -1229,8 +1235,7 @@ class CommonUtilsTest(test_utils.ReleaseToolsTestCase):
self.assertEqual(
'1-5 9-10',
sparse_image.file_map['//system/file1'].extra['text_str'])
self.assertTrue(
sparse_image.file_map['//system/file2'].extra['incomplete'])
self.assertTrue(sparse_image.file_map['//system/file2'].extra['incomplete'])
self.assertTrue(
sparse_image.file_map['/system/app/file3'].extra['incomplete'])
@ -1338,7 +1343,7 @@ class CommonUtilsTest(test_utils.ReleaseToolsTestCase):
'recovery_api_version': 3,
'fstab_version': 2,
'system_root_image': 'true',
'no_recovery': 'true',
'no_recovery' : 'true',
'recovery_as_boot': 'true',
}
@ -1659,7 +1664,6 @@ class CommonUtilsTest(test_utils.ReleaseToolsTestCase):
self.assertRaises(common.ExternalError, common._GenerateGkiCertificate,
test_file.name, 'generic_kernel')
class InstallRecoveryScriptFormatTest(test_utils.ReleaseToolsTestCase):
"""Checks the format of install-recovery.sh.
@ -1669,7 +1673,7 @@ class InstallRecoveryScriptFormatTest(test_utils.ReleaseToolsTestCase):
def setUp(self):
self._tempdir = common.MakeTempDir()
# Create a fake dict that contains the fstab info for boot&recovery.
self._info = {"fstab": {}}
self._info = {"fstab" : {}}
fake_fstab = [
"/dev/soc.0/by-name/boot /boot emmc defaults defaults",
"/dev/soc.0/by-name/recovery /recovery emmc defaults defaults"]