From 8794610c76f0ac040c9ac4d298aca7a65a70713a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 22 Dec 2020 11:38:02 +1100 Subject: [PATCH] Block TIFFTAG_SUBIFD --- Tests/test_file_tiff.py | 10 +++++++++- src/PIL/TiffImagePlugin.py | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index f644ef8870e..bb1bbda3e76 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -4,7 +4,7 @@ import pytest from PIL import Image, TiffImagePlugin -from PIL.TiffImagePlugin import RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION +from PIL.TiffImagePlugin import RESOLUTION_UNIT, SUBIFD, X_RESOLUTION, Y_RESOLUTION from .helper import ( assert_image_equal, @@ -161,6 +161,14 @@ def test_save_dpi_rounding(self, tmp_path): reloaded.load() assert (round(dpi), round(dpi)) == reloaded.info["dpi"] + def test_subifd(self, tmp_path): + outfile = str(tmp_path / "temp.tif") + with Image.open("Tests/images/g4_orientation_6.tif") as im: + im.tag_v2[SUBIFD] = 10000 + + # Should not segfault + im.save(outfile) + def test_save_setting_missing_resolution(self): b = BytesIO() Image.open("Tests/images/10ct_32bit_128.tiff").save( diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index bbfd28cc247..5480fcd8551 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -89,6 +89,7 @@ PREDICTOR = 317 COLORMAP = 320 TILEOFFSETS = 324 +SUBIFD = 330 EXTRASAMPLES = 338 SAMPLEFORMAT = 339 JPEGTABLES = 347 @@ -1559,12 +1560,14 @@ def _save(im, fp, filename): # The other tags expect arrays with a certain length (fixed or depending on # BITSPERSAMPLE, etc), passing arrays with a different length will result in # segfaults. Block these tags until we add extra validation. + # SUBIFD may also cause a segfault. blocklist = [ REFERENCEBLACKWHITE, SAMPLEFORMAT, STRIPBYTECOUNTS, STRIPOFFSETS, TRANSFERFUNCTION, + SUBIFD, ] atts = {}