mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-05 06:00:58 +03:00
Only read until the offset of the next tile
This commit is contained in:
parent
cbc55c4621
commit
024ed66096
|
@ -118,6 +118,26 @@ class TestImageFile:
|
||||||
|
|
||||||
assert_image_equal(im1, im2)
|
assert_image_equal(im1, im2)
|
||||||
|
|
||||||
|
def test_tile_size(self) -> None:
|
||||||
|
with open("Tests/images/hopper.tif", "rb") as im_fp:
|
||||||
|
data = im_fp.read()
|
||||||
|
|
||||||
|
reads = []
|
||||||
|
|
||||||
|
class FP(BytesIO):
|
||||||
|
def read(self, size: int | None = None) -> bytes:
|
||||||
|
reads.append(size)
|
||||||
|
return super().read(size)
|
||||||
|
|
||||||
|
fp = FP(data)
|
||||||
|
with Image.open(fp) as im:
|
||||||
|
assert len(im.tile) == 7
|
||||||
|
|
||||||
|
im.load()
|
||||||
|
|
||||||
|
# Despite multiple tiles, assert only one tile caused a read of maxblock size
|
||||||
|
assert reads.count(im.decodermaxblock) == 1
|
||||||
|
|
||||||
def test_raise_oserror(self) -> None:
|
def test_raise_oserror(self) -> None:
|
||||||
with pytest.warns(DeprecationWarning):
|
with pytest.warns(DeprecationWarning):
|
||||||
with pytest.raises(OSError):
|
with pytest.raises(OSError):
|
||||||
|
|
|
@ -263,7 +263,7 @@ class ImageFile(Image.Image):
|
||||||
self.tile, lambda tile: (tile[0], tile[1], tile[3])
|
self.tile, lambda tile: (tile[0], tile[1], tile[3])
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
for decoder_name, extents, offset, args in self.tile:
|
for i, (decoder_name, extents, offset, args) in enumerate(self.tile):
|
||||||
seek(offset)
|
seek(offset)
|
||||||
decoder = Image._getdecoder(
|
decoder = Image._getdecoder(
|
||||||
self.mode, decoder_name, args, self.decoderconfig
|
self.mode, decoder_name, args, self.decoderconfig
|
||||||
|
@ -276,8 +276,13 @@ class ImageFile(Image.Image):
|
||||||
else:
|
else:
|
||||||
b = prefix
|
b = prefix
|
||||||
while True:
|
while True:
|
||||||
|
read_bytes = self.decodermaxblock
|
||||||
|
if i + 1 < len(self.tile):
|
||||||
|
next_offset = self.tile[i + 1].offset
|
||||||
|
if next_offset > offset:
|
||||||
|
read_bytes = next_offset - offset
|
||||||
try:
|
try:
|
||||||
s = read(self.decodermaxblock)
|
s = read(read_bytes)
|
||||||
except (IndexError, struct.error) as e:
|
except (IndexError, struct.error) as e:
|
||||||
# truncated png/gif
|
# truncated png/gif
|
||||||
if LOAD_TRUNCATED_IMAGES:
|
if LOAD_TRUNCATED_IMAGES:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user