Revert "Remove all ZIP64LIMIT hack"
This reverts commit 37a4290909
.
Reason for revert: b/278156419
Change-Id: I67ea667619a9623be849d911993010ef0f0bfd88
This commit is contained in:
parent
37a4290909
commit
f92f7f046a
9 changed files with 101 additions and 67 deletions
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 = (
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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"]
|
||||
|
|
Loading…
Reference in a new issue