diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index ca3c055f91a..c9849a056a3 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -377,6 +377,21 @@ def test_tag_type( assert isinstance(reloaded, TiffImagePlugin.TiffImageFile) assert reloaded.tag_v2[37000] == 100 + @pytest.mark.parametrize("tagtype", (TiffTags.BYTE, TiffTags.ASCII)) + def test_non_bytes( + self, tagtype: int, monkeypatch: pytest.MonkeyPatch, tmp_path: Path + ) -> None: + monkeypatch.setattr(TiffImagePlugin, "WRITE_LIBTIFF", True) + + ifd = TiffImagePlugin.ImageFileDirectory_v2() + ifd[37000] = 100 + ifd.tagtype[37000] = tagtype + + out = tmp_path / "temp.tif" + im = Image.new("L", (1, 1)) + with pytest.raises(ValueError, match="Incorrect tag value type"): + im.save(out, tiffinfo=ifd) + def test_inknames_tag( self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path ) -> None: diff --git a/src/encode.c b/src/encode.c index dbfd841b3ef..d9fd8764830 100644 --- a/src/encode.c +++ b/src/encode.c @@ -849,6 +849,11 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) { if (type == TIFF_BYTE || type == TIFF_UNDEFINED || key_int == TIFFTAG_INKNAMES) { + if (!PyBytes_Check(value)) { + Py_DECREF(encoder); + PyErr_SetString(PyExc_ValueError, "Incorrect tag value type"); + return NULL; + } status = ImagingLibTiffSetField( &encoder->state, (ttag_t)key_int, @@ -1022,6 +1027,11 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) { &encoder->state, (ttag_t)key_int, (INT8)PyLong_AsLong(value) ); } else if (type == TIFF_ASCII) { + if (!PyBytes_Check(value)) { + Py_DECREF(encoder); + PyErr_SetString(PyExc_ValueError, "Incorrect tag value type"); + return NULL; + } status = ImagingLibTiffSetField( &encoder->state, (ttag_t)key_int, PyBytes_AsString(value) );