From 13c5b8c855951453fbfe4cea5f96c8e8d38311df Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 2 Oct 2026 16:22:41 +1000 Subject: [PATCH] Raise OSError when tile size is unexpected --- Tests/images/tiff_tiled_jpeg_oob_read.tif | Bin 0 -> 29653 bytes Tests/test_file_libtiff.py | 10 ++++++++++ src/libImaging/TiffDecode.c | 3 ++- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Tests/images/tiff_tiled_jpeg_oob_read.tif diff --git a/Tests/images/tiff_tiled_jpeg_oob_read.tif b/Tests/images/tiff_tiled_jpeg_oob_read.tif new file mode 100644 index 0000000000000000000000000000000000000000..51cd33e729ddfc3ce35bd0b2a12d11e80cb97c82 GIT binary patch literal 29653 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 30280f9ecf9..97337a82882 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -1028,6 +1028,16 @@ def test_tiled_ycbcr_jpeg_2x2_sampling(self) -> None: with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/flower.jpg", 1.5) + def test_tiled_jpeg_oob_read(self) -> None: + # A tiled TIFF whose libtiff-decoded, JPEG-compressed tile storage + # (TIFFTileSize) is smaller than tile_length rows of the *unpacked* + # rawmode's bytes-per-pixel would require. Decoding must fail safely + # rather than let the row unpacker read past the tile buffer + infile = "Tests/images/tiff_tiled_jpeg_oob_read.tif" + with Image.open(infile) as im: + with pytest.raises(OSError): + im.load() + def test_strip_planar_rgb(self) -> None: # gdal_translate -co TILED=no -co INTERLEAVE=BAND -co COMPRESS=LZW \ # tiff_strip_raw.tif tiff_strip_planar_lzw.tiff diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 92e23f9c6a2..36039a28167 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -352,7 +352,8 @@ _decodeTile( return -1; } - if (tile_bytes_size > ((tile_length * state->bits / planes + 7) / 8) * tile_width) { + if (tile_bytes_size != + ((tile_length * state->bits / planes + 7) / 8) * tile_width) { // If the tile size as expected by LibTiff isn't what we're expecting, abort. // man: TIFFTileSize returns the equivalent size for a tile of data as it // would be returned in a call to TIFFReadTile ...