Skip to content

Commit

Permalink
Only read until the offset of the next tile
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed Dec 19, 2024
1 parent cbc55c4 commit 024ed66
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
20 changes: 20 additions & 0 deletions Tests/test_imagefile.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,26 @@ def test_safeblock(self) -> None:

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:
with pytest.warns(DeprecationWarning):
with pytest.raises(OSError):
Expand Down
9 changes: 7 additions & 2 deletions src/PIL/ImageFile.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ def load(self) -> Image.core.PixelAccess | None:
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)
decoder = Image._getdecoder(
self.mode, decoder_name, args, self.decoderconfig
Expand All @@ -276,8 +276,13 @@ def load(self) -> Image.core.PixelAccess | None:
else:
b = prefix
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:
s = read(self.decodermaxblock)
s = read(read_bytes)
except (IndexError, struct.error) as e:
# truncated png/gif
if LOAD_TRUNCATED_IMAGES:
Expand Down

0 comments on commit 024ed66

Please sign in to comment.