This commit is contained in:
Martin Fitzpatrick 2015-09-10 14:05:46 +00:00
commit 8c2dc27346

View File

@ -2291,9 +2291,11 @@ def open(fp, mode="r"):
fp = builtins.open(filename, "rb")
try:
fp.seek(0)
except (AttributeError, io.UnsupportedOperation):
fp = io.BytesIO(fp.read())
requires_iobytes_wrapper = not fp.seekable()
except AttributeError:
# Not a subclass of io.IOBase; probably Python 2.7 file (or urllib object)
# Check we have a seek fn on the object
requires_iobytes_wrapper = not callable( getattr(fp, "seek", None) )
prefix = fp.read(16)
@ -2303,6 +2305,9 @@ def open(fp, mode="r"):
try:
factory, accept = OPEN[i]
if not accept or accept(prefix):
if requires_iobytes_wrapper:
fp = io.BytesIO(prefix + fp.read())
requires_iobytes_wrapper = False # Wrapping once is enough
fp.seek(0)
im = factory(fp, filename)
_decompression_bomb_check(im.size)
@ -2316,6 +2321,9 @@ def open(fp, mode="r"):
try:
factory, accept = OPEN[i]
if not accept or accept(prefix):
if requires_iobytes_wrapper:
fp = io.BytesIO(prefix + fp.read())
requires_iobytes_wrapper = False # Wrapping once is enough
fp.seek(0)
im = factory(fp, filename)
_decompression_bomb_check(im.size)