Do not allow TIFF to seek to a past frame

This commit is contained in:
Andrew Murray 2021-05-08 00:25:47 +10:00
parent 8354fa4929
commit 9ac888262a
5 changed files with 19 additions and 1 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -301,6 +301,19 @@ class TestFileTiff:
assert im.size == (20, 20) assert im.size == (20, 20)
assert im.convert("RGB").getpixel((0, 0)) == (0, 0, 255) assert im.convert("RGB").getpixel((0, 0)) == (0, 0, 255)
def test_frame_order(self):
# A frame can't progress to itself after reading
with Image.open("Tests/images/multipage_single_frame_loop.tiff") as im:
assert im.n_frames == 1
# A frame can't progress to a frame that has already been read
with Image.open("Tests/images/multipage_multiple_frame_loop.tiff") as im:
assert im.n_frames == 2
# Frames don't have to be in sequence
with Image.open("Tests/images/multipage_out_of_order.tiff") as im:
assert im.n_frames == 3
def test___str__(self): def test___str__(self):
filename = "Tests/images/pil136.tiff" filename = "Tests/images/pil136.tiff"
with Image.open(filename) as im: with Image.open(filename) as im:

View File

@ -1067,7 +1067,12 @@ class TiffImageFile(ImageFile.ImageFile):
self._frame_pos.append(self.__next) self._frame_pos.append(self.__next)
logger.debug("Loading tags, location: %s" % self.fp.tell()) logger.debug("Loading tags, location: %s" % self.fp.tell())
self.tag_v2.load(self.fp) self.tag_v2.load(self.fp)
self.__next = self.tag_v2.next if self.tag_v2.next in self._frame_pos:
# This IFD has already been processed
# Declare this to be the end of the image
self.__next = 0
else:
self.__next = self.tag_v2.next
if self.__next == 0: if self.__next == 0:
self._n_frames = frame + 1 self._n_frames = frame + 1
if len(self._frame_pos) == 1: if len(self._frame_pos) == 1: