Revert "Remove all ZIP64LIMIT hack"
This reverts commit 37a4290909
.
Reason for revert: b/278156419
Change-Id: I67ea667619a9623be849d911993010ef0f0bfd88
This commit is contained in:
committed by
Gerrit Code Review
parent
37a4290909
commit
f92f7f046a
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user