From 16cc43e59c856a9b59f09115ef3bec482ae98b69 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 19 Oct 2026 19:39:10 +1100 Subject: [PATCH] Do not load tile after seeking to zero dimension frame --- Tests/test_imagefile.py | 22 ++++++++++++++++++++++ src/PIL/ImageFile.py | 8 ++++++++ 2 files changed, 30 insertions(+) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index d7bce695b08..1b74ade26de 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -165,6 +165,28 @@ def test_negative_offset(self) -> None: with pytest.raises(ValueError, match="Tile offset cannot be negative"): im.load() + @pytest.mark.parametrize("size", ((1, 0), (0, 1), (0, 0))) + def test_zero_dimension_seek(self, size: tuple[int, int]) -> None: + class ZeroImageFile(ImageFile.ImageFile): + def _open(self) -> None: + self._mode = "1" + self._size = (1, 1) + self._im = Image.core.fill(self.mode, self.size) + + def seek(self, frame: int) -> None: + self._size = (0, 0) + self.tile = [ImageFile._Tile("raw")] + + self.frame = frame + Image.Image.seek(self, frame) + + def tell(self) -> int: + return self.frame + + im = ZeroImageFile(BytesIO(b"")) + im.seek(1) + im.load() + @pytest.mark.parametrize("xy", ((-1, 0), (0, -1))) def test_negative_tile_extents(self, xy: tuple[int, int]) -> None: im = Image.new("1", (1, 1)) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 2cac8953372..3c35ac4336a 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -300,6 +300,14 @@ def load(self) -> Image.core.PixelAccess | None: msg = "cannot load this image" raise OSError(msg) + if self.width == 0 or self.height == 0: + ImageFile.load_prepare(self) + + self.tile = [] + self.readonly = 0 + + return Image.Image.load(self) + pixel = Image.Image.load(self) if not self.tile: return pixel