From 61753891869d75bff3ce9256b684d3da0762f01a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 1 Jan 2021 12:45:02 +1100 Subject: [PATCH 01/79] Only read different sizes for "Large Thumbnail" frames --- Tests/images/ignore_frame_size.mpo | Bin 0 -> 4405 bytes Tests/test_file_mpo.py | 13 ++++++++++++- src/PIL/MpoImagePlugin.py | 8 +++++--- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 Tests/images/ignore_frame_size.mpo diff --git a/Tests/images/ignore_frame_size.mpo b/Tests/images/ignore_frame_size.mpo new file mode 100644 index 0000000000000000000000000000000000000000..c4d60707a47f18ffe644a27443b974b3c3c613f2 GIT binary patch literal 4405 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 h33pE!X2e@Fx7){P#9i~X->y}7kfIL?53 Date: Fri, 1 Jan 2021 13:00:01 +1100 Subject: [PATCH 02/79] Changed MP Type to match #1631 image --- Tests/images/sugarshack_frame_size.mpo | Bin 120198 -> 120198 bytes Tests/test_file_mpo.py | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/images/sugarshack_frame_size.mpo b/Tests/images/sugarshack_frame_size.mpo index 81d58e64b8268eac4210f1506b4dbded0b92ffda..009280a79a648be15d6064c96f931e71ce9fde8e 100644 GIT binary patch delta 22 ecmZo$&EB?}eZx_4W=00a<`d%EPlz+_+Y10*> Date: Thu, 21 Jan 2021 19:29:11 +1100 Subject: [PATCH 03/79] Handle PCX images with an odd stride --- Tests/images/odd_stride.pcx | Bin 0 -> 14313 bytes Tests/test_file_pcx.py | 8 ++++++++ src/PIL/PcxImagePlugin.py | 13 +++++++++---- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 Tests/images/odd_stride.pcx diff --git a/Tests/images/odd_stride.pcx b/Tests/images/odd_stride.pcx new file mode 100644 index 0000000000000000000000000000000000000000..ee0c2eecaebe5a629ccfab523971c347a878ae79 GIT binary patch literal 14313 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_pcx.py b/Tests/test_file_pcx.py index 670c03b95..61e33a57b 100644 --- a/Tests/test_file_pcx.py +++ b/Tests/test_file_pcx.py @@ -44,6 +44,14 @@ def test_odd(tmp_path): _roundtrip(tmp_path, hopper(mode).resize((511, 511))) +def test_odd_read(): + # Reading an image with an odd stride, making it malformed + with Image.open("Tests/images/odd_stride.pcx") as im: + im.load() + + assert im.size == (371, 150) + + def test_pil184(): # Check reading of files where xmin/xmax is not zero. diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index 3874e5436..d2e166bdd 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -66,13 +66,13 @@ class PcxImageFile(ImageFile.ImageFile): version = s[1] bits = s[3] planes = s[65] - ignored_stride = i16(s, 66) + provided_stride = i16(s, 66) logger.debug( "PCX version %s, bits %s, planes %s, stride %s", version, bits, planes, - ignored_stride, + provided_stride, ) self.info["dpi"] = i16(s, 12), i16(s, 14) @@ -110,10 +110,15 @@ class PcxImageFile(ImageFile.ImageFile): self.mode = mode self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] - # don't trust the passed in stride. Calculate for ourselves. + # Don't trust the passed in stride. + # Calculate the approximate position for ourselves. # CVE-2020-35653 stride = (self._size[0] * bits + 7) // 8 - stride += stride % 2 + + # While the specification states that this must be even, + # not all images follow this + if provided_stride != stride: + stride += stride % 2 bbox = (0, 0) + self.size logger.debug("size: %sx%s", *self.size) From b39977e1c2fca2aef8c28d31522136a11a9be59e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 21 Jan 2021 21:33:35 +1100 Subject: [PATCH 04/79] Document license for several fonts --- .../DejaVuSans-24-1-stripped.ttf | Bin .../DejaVuSans-24-2-stripped.ttf | Bin .../DejaVuSans-24-4-stripped.ttf | Bin .../DejaVuSans-24-8-stripped.ttf | Bin Tests/fonts/{ => DejaVuSans}/DejaVuSans.ttf | Bin Tests/fonts/DejaVuSans/LICENSE.txt | 40 ++++++++++++++++++ Tests/fonts/LICENSE.txt | 3 +- Tests/test_imagefont.py | 12 +++--- Tests/test_imagefontctl.py | 2 +- 9 files changed, 50 insertions(+), 7 deletions(-) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans-24-1-stripped.ttf (100%) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans-24-2-stripped.ttf (100%) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans-24-4-stripped.ttf (100%) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans-24-8-stripped.ttf (100%) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans.ttf (100%) create mode 100644 Tests/fonts/DejaVuSans/LICENSE.txt diff --git a/Tests/fonts/DejaVuSans-24-1-stripped.ttf b/Tests/fonts/DejaVuSans/DejaVuSans-24-1-stripped.ttf similarity index 100% rename from Tests/fonts/DejaVuSans-24-1-stripped.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans-24-1-stripped.ttf diff --git a/Tests/fonts/DejaVuSans-24-2-stripped.ttf b/Tests/fonts/DejaVuSans/DejaVuSans-24-2-stripped.ttf similarity index 100% rename from Tests/fonts/DejaVuSans-24-2-stripped.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans-24-2-stripped.ttf diff --git a/Tests/fonts/DejaVuSans-24-4-stripped.ttf b/Tests/fonts/DejaVuSans/DejaVuSans-24-4-stripped.ttf similarity index 100% rename from Tests/fonts/DejaVuSans-24-4-stripped.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans-24-4-stripped.ttf diff --git a/Tests/fonts/DejaVuSans-24-8-stripped.ttf b/Tests/fonts/DejaVuSans/DejaVuSans-24-8-stripped.ttf similarity index 100% rename from Tests/fonts/DejaVuSans-24-8-stripped.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans-24-8-stripped.ttf diff --git a/Tests/fonts/DejaVuSans.ttf b/Tests/fonts/DejaVuSans/DejaVuSans.ttf similarity index 100% rename from Tests/fonts/DejaVuSans.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans.ttf diff --git a/Tests/fonts/DejaVuSans/LICENSE.txt b/Tests/fonts/DejaVuSans/LICENSE.txt new file mode 100644 index 000000000..30516578f --- /dev/null +++ b/Tests/fonts/DejaVuSans/LICENSE.txt @@ -0,0 +1,40 @@ +DejaVuSans-24-{1,2,4,8}-stripped.ttf are based on DejaVuSans.ttf converted using FontForge to add bitmap strikes and keep only the ASCII range. + +DejaVu Fonts — License +Fonts are © Bitstream (see below). DejaVu changes are in public domain. Explanation of copyright is on Gnome page on Bitstream Vera fonts. Glyphs imported from Arev fonts are © Tavmjung Bah (see below) + +Bitstream Vera Fonts Copyright +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. + +Arev Fonts Copyright +Original text + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. \ No newline at end of file diff --git a/Tests/fonts/LICENSE.txt b/Tests/fonts/LICENSE.txt index 06eaa9a4e..88a28de59 100644 --- a/Tests/fonts/LICENSE.txt +++ b/Tests/fonts/LICENSE.txt @@ -15,8 +15,9 @@ FreeMono.ttf is licensed under GPLv3, with the GPL font exception. OpenSansCondensed-LightItalic.tt, from https://fonts.google.com/specimen/Open+Sans, under Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) -DejaVuSans-24-{1,2,4,8}-stripped.ttf are based on DejaVuSans.ttf converted using FontForge to add bitmap strikes and keep only the ASCII range. +KhmerOSBattambang-Regular.ttf is licensed under LGPL-2.1 or later. +FreeMono.ttf is licensed under GPLv3. 10x20-ISO8859-1.pcf, from https://packages.ubuntu.com/xenial/xfonts-base diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 0c219fed1..2a2349e3b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -52,7 +52,7 @@ class TestImageFont: ttf_copy = ttf.font_variant(size=FONT_SIZE + 1) assert ttf_copy.size == FONT_SIZE + 1 - second_font_path = "Tests/fonts/DejaVuSans.ttf" + second_font_path = "Tests/fonts/DejaVuSans/DejaVuSans.ttf" ttf_copy = ttf.font_variant(font=second_font_path) assert ttf_copy.path == second_font_path @@ -156,8 +156,8 @@ class TestImageFont: ("text", "L", "FreeMono.ttf", 15, 36, 36), ("text", "1", "FreeMono.ttf", 15, 36, 36), # issue 4177 - ("rrr", "L", "DejaVuSans.ttf", 18, 21, 22.21875), - ("rrr", "1", "DejaVuSans.ttf", 18, 24, 22.21875), + ("rrr", "L", "DejaVuSans/DejaVuSans.ttf", 18, 21, 22.21875), + ("rrr", "1", "DejaVuSans/DejaVuSans.ttf", 18, 24, 22.21875), # test 'l' not including extra margin # using exact value 2047 / 64 for raqm, checked with debugger ("ill", "L", "OpenSansCondensed-LightItalic.ttf", 63, 33, 31.984375), @@ -855,7 +855,7 @@ class TestImageFont: layout_name = ["basic", "raqm"][self.LAYOUT_ENGINE] target = f"Tests/images/bitmap_font_{bpp}_{layout_name}.png" font = ImageFont.truetype( - f"Tests/fonts/DejaVuSans-24-{bpp}-stripped.ttf", + f"Tests/fonts/DejaVuSans/DejaVuSans-24-{bpp}-stripped.ttf", 24, layout_engine=self.LAYOUT_ENGINE, ) @@ -963,7 +963,9 @@ def test_render_mono_size(): im = Image.new("P", (100, 30), "white") draw = ImageDraw.Draw(im) ttf = ImageFont.truetype( - "Tests/fonts/DejaVuSans.ttf", 18, layout_engine=ImageFont.LAYOUT_BASIC + "Tests/fonts/DejaVuSans/DejaVuSans.ttf", + 18, + layout_engine=ImageFont.LAYOUT_BASIC, ) draw.text((10, 10), "r" * 10, "black", ttf) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 82e2b4ebc..a80aca2fb 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -10,7 +10,7 @@ from .helper import ( ) FONT_SIZE = 20 -FONT_PATH = "Tests/fonts/DejaVuSans.ttf" +FONT_PATH = "Tests/fonts/DejaVuSans/DejaVuSans.ttf" pytestmark = skip_unless_feature("raqm") From f2f92d22d180ddcecab5bf9c0a4c0151c04d0980 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 25 Jan 2021 21:10:49 +1100 Subject: [PATCH 05/79] Do not use "use built-in mapper WIN32 only" --- src/PIL/ImageFile.py | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index f2a55cb54..f58de95bd 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -192,24 +192,14 @@ class ImageFile(Image.Image): and args[0] in Image._MAPMODES ): try: - if hasattr(Image.core, "map"): - # use built-in mapper WIN32 only - self.map = Image.core.map(self.filename) - self.map.seek(offset) - self.im = self.map.readimage( - self.mode, self.size, args[1], args[2] - ) - else: - # use mmap, if possible - import mmap + # use mmap, if possible + import mmap - with open(self.filename) as fp: - self.map = mmap.mmap( - fp.fileno(), 0, access=mmap.ACCESS_READ - ) - self.im = Image.core.map_buffer( - self.map, self.size, decoder_name, offset, args - ) + with open(self.filename) as fp: + self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) + self.im = Image.core.map_buffer( + self.map, self.size, decoder_name, offset, args + ) readonly = 1 # After trashing self.im, # we might need to reload the palette data. From 685e95118250e764ff50e6ed29d5ed96fc873b4a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 25 Jan 2021 21:13:07 +1100 Subject: [PATCH 06/79] Removed unused C code --- src/_imaging.c | 5 - src/map.c | 260 ------------------------------------------------- 2 files changed, 265 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 01dd22486..a5b12d325 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3973,8 +3973,6 @@ PyPath_Create(ImagingObject *self, PyObject *args); extern PyObject * PyOutline_Create(ImagingObject *self, PyObject *args); -extern PyObject * -PyImaging_Mapper(PyObject *self, PyObject *args); extern PyObject * PyImaging_MapBuffer(PyObject *self, PyObject *args); @@ -4030,9 +4028,6 @@ static PyMethodDef functions[] = { /* Memory mapping */ #ifdef WITH_MAPPING -#ifdef _WIN32 - {"map", (PyCFunction)PyImaging_Mapper, 1}, -#endif {"map_buffer", (PyCFunction)PyImaging_MapBuffer, 1}, #endif diff --git a/src/map.c b/src/map.c index 2636a684b..c298bd148 100644 --- a/src/map.c +++ b/src/map.c @@ -28,269 +28,9 @@ PyImaging_CheckBuffer(PyObject *buffer); extern int PyImaging_GetBuffer(PyObject *buffer, Py_buffer *view); -/* -------------------------------------------------------------------- */ -/* Standard mapper */ - -typedef struct { - PyObject_HEAD char *base; - int size; - int offset; -#ifdef _WIN32 - HANDLE hFile; - HANDLE hMap; -#endif -} ImagingMapperObject; - -static PyTypeObject ImagingMapperType; - -ImagingMapperObject * -PyImaging_MapperNew(const char *filename, int readonly) { - ImagingMapperObject *mapper; - - if (PyType_Ready(&ImagingMapperType) < 0) { - return NULL; - } - - mapper = PyObject_New(ImagingMapperObject, &ImagingMapperType); - if (mapper == NULL) { - return NULL; - } - - mapper->base = NULL; - mapper->size = mapper->offset = 0; - -#ifdef _WIN32 - mapper->hFile = (HANDLE)-1; - mapper->hMap = (HANDLE)-1; - - /* FIXME: currently supports readonly mappings only */ - mapper->hFile = CreateFile( - filename, - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - if (mapper->hFile == (HANDLE)-1) { - PyErr_SetString(PyExc_OSError, "cannot open file"); - Py_DECREF(mapper); - return NULL; - } - - mapper->hMap = CreateFileMapping(mapper->hFile, NULL, PAGE_READONLY, 0, 0, NULL); - if (mapper->hMap == (HANDLE)-1) { - CloseHandle(mapper->hFile); - PyErr_SetString(PyExc_OSError, "cannot map file"); - Py_DECREF(mapper); - return NULL; - } - - mapper->base = (char *)MapViewOfFile(mapper->hMap, FILE_MAP_READ, 0, 0, 0); - - mapper->size = GetFileSize(mapper->hFile, 0); -#endif - - return mapper; -} - -static void -mapping_dealloc(ImagingMapperObject *mapper) { -#ifdef _WIN32 - if (mapper->base != 0) { - UnmapViewOfFile(mapper->base); - } - if (mapper->hMap != (HANDLE)-1) { - CloseHandle(mapper->hMap); - } - if (mapper->hFile != (HANDLE)-1) { - CloseHandle(mapper->hFile); - } - mapper->base = 0; - mapper->hMap = mapper->hFile = (HANDLE)-1; -#endif - PyObject_Del(mapper); -} - -/* -------------------------------------------------------------------- */ -/* standard file operations */ - -static PyObject * -mapping_read(ImagingMapperObject *mapper, PyObject *args) { - PyObject *buf; - - int size = -1; - if (!PyArg_ParseTuple(args, "|i", &size)) { - return NULL; - } - - /* check size */ - if (size < 0 || mapper->offset + size > mapper->size) { - size = mapper->size - mapper->offset; - } - if (size < 0) { - size = 0; - } - - buf = PyBytes_FromStringAndSize(NULL, size); - if (!buf) { - return NULL; - } - - if (size > 0) { - memcpy(PyBytes_AsString(buf), mapper->base + mapper->offset, size); - mapper->offset += size; - } - - return buf; -} - -static PyObject * -mapping_seek(ImagingMapperObject *mapper, PyObject *args) { - int offset; - int whence = 0; - if (!PyArg_ParseTuple(args, "i|i", &offset, &whence)) { - return NULL; - } - - switch (whence) { - case 0: /* SEEK_SET */ - mapper->offset = offset; - break; - case 1: /* SEEK_CUR */ - mapper->offset += offset; - break; - case 2: /* SEEK_END */ - mapper->offset = mapper->size + offset; - break; - default: - /* FIXME: raise ValueError? */ - break; - } - - Py_INCREF(Py_None); - return Py_None; -} - -/* -------------------------------------------------------------------- */ -/* map entire image */ - extern PyObject * PyImagingNew(Imaging im); -static void -ImagingDestroyMap(Imaging im) { - return; /* nothing to do! */ -} - -static PyObject * -mapping_readimage(ImagingMapperObject *mapper, PyObject *args) { - int y, size; - Imaging im; - - char *mode; - int xsize; - int ysize; - int stride; - int orientation; - if (!PyArg_ParseTuple( - args, "s(ii)ii", &mode, &xsize, &ysize, &stride, &orientation)) { - return NULL; - } - - if (stride <= 0) { - /* FIXME: maybe we should call ImagingNewPrologue instead */ - if (!strcmp(mode, "L") || !strcmp(mode, "P")) { - stride = xsize; - } else if (!strcmp(mode, "I;16") || !strcmp(mode, "I;16B")) { - stride = xsize * 2; - } else { - stride = xsize * 4; - } - } - - size = ysize * stride; - - if (mapper->offset + size > mapper->size) { - PyErr_SetString(PyExc_OSError, "image file truncated"); - return NULL; - } - - im = ImagingNewPrologue(mode, xsize, ysize); - if (!im) { - return NULL; - } - - /* setup file pointers */ - if (orientation > 0) { - for (y = 0; y < ysize; y++) { - im->image[y] = mapper->base + mapper->offset + y * stride; - } - } else { - for (y = 0; y < ysize; y++) { - im->image[ysize - y - 1] = mapper->base + mapper->offset + y * stride; - } - } - - im->destroy = ImagingDestroyMap; - - mapper->offset += size; - - return PyImagingNew(im); -} - -static struct PyMethodDef methods[] = { - /* standard file interface */ - {"read", (PyCFunction)mapping_read, 1}, - {"seek", (PyCFunction)mapping_seek, 1}, - /* extensions */ - {"readimage", (PyCFunction)mapping_readimage, 1}, - {NULL, NULL} /* sentinel */ -}; - -static PyTypeObject ImagingMapperType = { - PyVarObject_HEAD_INIT(NULL, 0) "ImagingMapper", /*tp_name*/ - sizeof(ImagingMapperObject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)mapping_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ -}; - -PyObject * -PyImaging_Mapper(PyObject *self, PyObject *args) { - char *filename; - if (!PyArg_ParseTuple(args, "s", &filename)) { - return NULL; - } - - return (PyObject *)PyImaging_MapperNew(filename, 1); -} - /* -------------------------------------------------------------------- */ /* Buffer mapper */ From e4b9f88de4378ae622b54998b186e93e68fab4c7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 30 Jan 2021 12:59:45 +1100 Subject: [PATCH 07/79] Updated test now that Win32 uses map_buffer --- Tests/test_map.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Tests/test_map.py b/Tests/test_map.py index 2b65fb3f9..9131e6b7d 100644 --- a/Tests/test_map.py +++ b/Tests/test_map.py @@ -4,10 +4,6 @@ import pytest from PIL import Image -from .helper import is_win32 - -pytestmark = pytest.mark.skipif(is_win32(), reason="Win32 does not call map_buffer") - def test_overflow(): # There is the potential to overflow comparisons in map.c From 11cb3fba9c93275d78f4339973560938fc07bd9e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 30 Jan 2021 13:01:42 +1100 Subject: [PATCH 08/79] Added test --- Tests/test_map.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Tests/test_map.py b/Tests/test_map.py index 9131e6b7d..752c5f268 100644 --- a/Tests/test_map.py +++ b/Tests/test_map.py @@ -23,6 +23,13 @@ def test_overflow(): Image.MAX_IMAGE_PIXELS = max_pixels +def test_tobytes(): + # Previously raised an access violation on Windows + with Image.open("Tests/images/l2rgb_read.bmp") as im: + with pytest.raises((ValueError, MemoryError, OSError)): + im.tobytes() + + @pytest.mark.skipif(sys.maxsize <= 2 ** 32, reason="Requires 64-bit system") def test_ysize(): numpy = pytest.importorskip("numpy", reason="NumPy not installed") From 79b17e4b1a756ba5f3e2c06c301c1034f52c0cbd Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 27 Dec 2020 18:09:35 +0100 Subject: [PATCH 09/79] Add CIFuzz Github Action --- .github/workflows/cifuzz.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/cifuzz.yml diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml new file mode 100644 index 000000000..d7f2a5bad --- /dev/null +++ b/.github/workflows/cifuzz.yml @@ -0,0 +1,24 @@ +name: CIFuzz +on: [push,pull_request] +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + id: build + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'pillow' + dry-run: false + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'pillow' + fuzz-seconds: 600 + dry-run: false + - name: Upload Crash + uses: actions/upload-artifact@v1 + if: failure() && steps.build.outcome == 'success' + with: + name: artifacts + path: ./out/artifacts From a12aa59e8beb4cda1c1599f6eb8471df872b8340 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 20 Feb 2021 12:44:49 +0100 Subject: [PATCH 10/79] Add language parameter ref: https://github.com/google/oss-fuzz/pull/5222 --- .github/workflows/cifuzz.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index d7f2a5bad..04fc152a0 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -9,12 +9,14 @@ jobs: uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master with: oss-fuzz-project-name: 'pillow' + language: python dry-run: false - name: Run Fuzzers uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master with: oss-fuzz-project-name: 'pillow' fuzz-seconds: 600 + language: python dry-run: false - name: Upload Crash uses: actions/upload-artifact@v1 From c0ee869c2c09bca7825e0fd9ef76515de880d6da Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Feb 2021 07:48:58 +1100 Subject: [PATCH 11/79] Only draw each rectangle outline pixel once --- .../imagedraw_rectangle_translucent_outline.png | Bin 0 -> 235 bytes Tests/test_imagedraw.py | 14 ++++++++++++++ src/libImaging/Draw.c | 4 ++-- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 Tests/images/imagedraw_rectangle_translucent_outline.png diff --git a/Tests/images/imagedraw_rectangle_translucent_outline.png b/Tests/images/imagedraw_rectangle_translucent_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..845648762ccab1e1d2047f653a9bb6bda4e22e65 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^DImhline(im, x0, y0 + i, x1, ink); draw->hline(im, x0, y1 - i, x1, ink); - draw->line(im, x1 - i, y0, x1 - i, y1, ink); - draw->line(im, x0 + i, y1, x0 + i, y0, ink); + draw->line(im, x1 - i, y0 + width, x1 - i, y1 - width + 1, ink); + draw->line(im, x0 + i, y0 + width, x0 + i, y1 - width + 1, ink); } } From 61ee8ec03cc9f12810e239d1618047cd7330d800 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 30 Dec 2020 03:27:28 +0100 Subject: [PATCH 12/79] document and add tests for SBIX color font support --- .github/workflows/test-windows.yml | 2 +- Tests/fonts/LICENSE.txt | 2 ++ Tests/fonts/chromacheck-sbix.woff | Bin 0 -> 740 bytes Tests/images/chromacheck-sbix.png | Bin 0 -> 1410 bytes Tests/images/chromacheck-sbix_mask.png | Bin 0 -> 1415 bytes Tests/test_imagefont.py | 40 +++++++++++++++++++++++++ docs/reference/ImageDraw.rst | 10 +++---- docs/releasenotes/8.0.0.rst | 3 +- 8 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 Tests/fonts/chromacheck-sbix.woff create mode 100644 Tests/images/chromacheck-sbix.png create mode 100644 Tests/images/chromacheck-sbix_mask.png diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index f3bb85f32..330db7c65 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -110,7 +110,7 @@ jobs: if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libwebp.cmd" - # for FreeType CBDT font support + # for FreeType CBDT/SBIX font support - name: Build dependencies / libpng if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libpng.cmd" diff --git a/Tests/fonts/LICENSE.txt b/Tests/fonts/LICENSE.txt index 06eaa9a4e..884f6a5bf 100644 --- a/Tests/fonts/LICENSE.txt +++ b/Tests/fonts/LICENSE.txt @@ -15,6 +15,8 @@ FreeMono.ttf is licensed under GPLv3, with the GPL font exception. OpenSansCondensed-LightItalic.tt, from https://fonts.google.com/specimen/Open+Sans, under Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) +chromacheck-sbix.woff, from https://github.com/RoelN/ChromaCheck, under The MIT License (MIT), Copyright (c) 2018 Roel Nieskens, https://pixelambacht.nl Copyright (c) 2018 Google LLC + DejaVuSans-24-{1,2,4,8}-stripped.ttf are based on DejaVuSans.ttf converted using FontForge to add bitmap strikes and keep only the ASCII range. diff --git a/Tests/fonts/chromacheck-sbix.woff b/Tests/fonts/chromacheck-sbix.woff new file mode 100644 index 0000000000000000000000000000000000000000..518d4b7ea6c45b7c3c660ef94aa6b71affa9fa70 GIT binary patch literal 740 zcmXT-cXMN4WB>xDCk)&mnmGYTU4j5$C_DxI*pFoa zFMC0LaS70GHb6cPNF4(+14D6ACeRKh49lLy?gieV(neV{1Cf6`;7E?e*CY!ubQsB?9d{$1L`WtPRA`}Ggf|lf4pT1 zJ3|}i2C!Sw4gf8wWnclhi^Yk};9268#19OYm;(MZGjec!x+H4F{O3;P&Luk`i&?MD$f~p69W~x5zbY02Qr}@)!CD**2oiA59uI$vD+NvI$ z+t77`sm3X0xnYAtT+4Zv2_NU_^(l&OzbBKzvU7pw!~ef*_}LXEi#>3b6Xth5l*#7S Xof)d6z~~=tKfTnC)0e?ILG362-q6Sn literal 0 HcmV?d00001 diff --git a/Tests/images/chromacheck-sbix.png b/Tests/images/chromacheck-sbix.png new file mode 100644 index 0000000000000000000000000000000000000000..b906ef133a473b8f5bb3f777b0342acdf7a841cf GIT binary patch literal 1410 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{ljGcd4vdb&7?h^t!3eJOz^LVrEgM07i zyyg6GeV_4d;k=3nhqeSp$tKnm4zUS}qnyz&7)=L5H80GWdGj8_hmQ8a?f#fwPCU}W T?Aix_Wh;ZHtDnm{r-UW|CpLkcdw+BWkigGfy{KSPE0h6bL4Ohzo+Cj@j9oCg;tIo|fc z%}SZo>IdR~$6kNM$!|00oH)orY}7fUDP$04WNgWD+sw$lj1NTl2V=p5aPJPr_uF`+ VU$07d4J=?8JYD@<);T3K0RVGNmXH7d literal 0 HcmV?d00001 diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 5d611a27f..757395bcf 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -897,6 +897,46 @@ class TestImageFont: assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or unsupported") + @skip_unless_feature_version("freetype2", "2.5.1") + def test_sbix(self): + try: + font = ImageFont.truetype( + "Tests/fonts/chromacheck-sbix.woff", + size=300, + layout_engine=self.LAYOUT_ENGINE, + ) + + im = Image.new("RGB", (400, 400), "white") + d = ImageDraw.Draw(im) + + d.text((50, 50), "\uE901", embedded_color=True, font=font) + + with Image.open("Tests/images/chromacheck-sbix.png") as expected: + assert_image_similar(im, expected, 1) + except IOError as e: + assert str(e) in ("unimplemented feature", "unknown file format") + pytest.skip("freetype compiled without libpng or unsupported") + + @skip_unless_feature_version("freetype2", "2.5.1") + def test_sbix_mask(self): + try: + font = ImageFont.truetype( + "Tests/fonts/chromacheck-sbix.woff", + size=300, + layout_engine=self.LAYOUT_ENGINE, + ) + + im = Image.new("RGB", (400, 400), "white") + d = ImageDraw.Draw(im) + + d.text((50, 50), "\uE901", (100, 0, 0), font=font) + + with Image.open("Tests/images/chromacheck-sbix_mask.png") as expected: + assert_image_similar(im, expected, 1) + except IOError as e: + assert str(e) in ("unimplemented feature", "unknown file format") + pytest.skip("freetype compiled without libpng or unsupported") + @skip_unless_feature_version("freetype2", "2.10.0") def test_colr(self): font = ImageFont.truetype( diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 57d1c2dda..e2ef548d4 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -352,7 +352,7 @@ Methods .. versionadded:: 6.2.0 - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. versionadded:: 8.0.0 @@ -413,7 +413,7 @@ Methods .. versionadded:: 6.2.0 - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. versionadded:: 8.0.0 @@ -577,7 +577,7 @@ Methods correct substitutions as appropriate, if available. It should be a `BCP 47 language code`_. Requires libraqm. - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. py:method:: ImageDraw.textbbox(xy, text, font=None, anchor=None, spacing=4, align="left", direction=None, features=None, language=None, stroke_width=0, embedded_color=False) @@ -626,7 +626,7 @@ Methods It should be a `BCP 47 language code`_. Requires libraqm. :param stroke_width: The width of the text stroke. - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. py:method:: ImageDraw.multiline_textbbox(xy, text, font=None, anchor=None, spacing=4, align="left", direction=None, features=None, language=None, stroke_width=0, embedded_color=False) @@ -669,7 +669,7 @@ Methods It should be a `BCP 47 language code`_. Requires libraqm. :param stroke_width: The width of the text stroke. - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. py:method:: getdraw(im=None, hints=None) diff --git a/docs/releasenotes/8.0.0.rst b/docs/releasenotes/8.0.0.rst index 1bef62e00..28dc8324d 100644 --- a/docs/releasenotes/8.0.0.rst +++ b/docs/releasenotes/8.0.0.rst @@ -115,8 +115,9 @@ now support fonts with embedded color data. To render text with embedded color data, use the parameter ``embedded_color=True``. Support for CBDT fonts requires FreeType 2.5 compiled with libpng. +Support for SBIX fonts requires FreeType 2.5.1 compiled with libpng. Support for COLR fonts requires FreeType 2.10. -SBIX and SVG fonts are not yet supported. +SVG fonts are not yet supported. ImageDraw.textlength ^^^^^^^^^^^^^^^^^^^^ From c709aa3d28abbdc006288ac88de082ba00439be0 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 30 Dec 2020 04:48:01 +0100 Subject: [PATCH 13/79] minor test formatting cleanup --- Tests/test_imagefont.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 757395bcf..259a0f872 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -869,12 +869,12 @@ class TestImageFont: im = Image.new("RGB", (150, 150), "white") d = ImageDraw.Draw(im) - d.text((10, 10), "\U0001f469", embedded_color=True, font=font) + d.text((10, 10), "\U0001f469", font=font, embedded_color=True) assert_image_similar_tofile(im, "Tests/images/cbdt_notocoloremoji.png", 6.2) - except IOError as e: + except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") - pytest.skip("freetype compiled without libpng or unsupported") + pytest.skip("freetype compiled without libpng or CBDT support") @skip_unless_feature_version("freetype2", "2.5.0") def test_cbdt_mask(self): @@ -893,9 +893,9 @@ class TestImageFont: assert_image_similar_tofile( im, "Tests/images/cbdt_notocoloremoji_mask.png", 6.2 ) - except IOError as e: + except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") - pytest.skip("freetype compiled without libpng or unsupported") + pytest.skip("freetype compiled without libpng or CBDT support") @skip_unless_feature_version("freetype2", "2.5.1") def test_sbix(self): @@ -909,13 +909,13 @@ class TestImageFont: im = Image.new("RGB", (400, 400), "white") d = ImageDraw.Draw(im) - d.text((50, 50), "\uE901", embedded_color=True, font=font) + d.text((50, 50), "\uE901", font=font, embedded_color=True) with Image.open("Tests/images/chromacheck-sbix.png") as expected: assert_image_similar(im, expected, 1) - except IOError as e: + except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") - pytest.skip("freetype compiled without libpng or unsupported") + pytest.skip("freetype compiled without libpng or SBIX support") @skip_unless_feature_version("freetype2", "2.5.1") def test_sbix_mask(self): @@ -933,9 +933,9 @@ class TestImageFont: with Image.open("Tests/images/chromacheck-sbix_mask.png") as expected: assert_image_similar(im, expected, 1) - except IOError as e: + except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") - pytest.skip("freetype compiled without libpng or unsupported") + pytest.skip("freetype compiled without libpng or SBIX support") @skip_unless_feature_version("freetype2", "2.10.0") def test_colr(self): @@ -948,7 +948,7 @@ class TestImageFont: im = Image.new("RGB", (300, 75), "white") d = ImageDraw.Draw(im) - d.text((15, 5), "Bungee", embedded_color=True, font=font) + d.text((15, 5), "Bungee", font=font, embedded_color=True) assert_image_similar_tofile(im, "Tests/images/colr_bungee.png", 21) From 8fb5fd7f633a64948c472e0716b0909a99e8029e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Feb 2021 12:14:49 +1100 Subject: [PATCH 14/79] Updated tests for changed helper imports --- Tests/test_imagefont.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 259a0f872..80ae55d32 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -911,8 +911,7 @@ class TestImageFont: d.text((50, 50), "\uE901", font=font, embedded_color=True) - with Image.open("Tests/images/chromacheck-sbix.png") as expected: - assert_image_similar(im, expected, 1) + assert_image_similar_tofile(im, "Tests/images/chromacheck-sbix.png", 1) except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or SBIX support") @@ -931,8 +930,7 @@ class TestImageFont: d.text((50, 50), "\uE901", (100, 0, 0), font=font) - with Image.open("Tests/images/chromacheck-sbix_mask.png") as expected: - assert_image_similar(im, expected, 1) + assert_image_similar_tofile(im, "Tests/images/chromacheck-sbix_mask.png", 1) except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or SBIX support") From f74d7d800ced0d7c7ad149196af4c3c839e66deb Mon Sep 17 00:00:00 2001 From: Jesus Cea Date: Mon, 22 Feb 2021 23:59:51 +0100 Subject: [PATCH 15/79] The example from filter should be next to filter method docs, not in 'frombytes' --- docs/reference/Image.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index f0a368479..a3df6b75f 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -160,7 +160,6 @@ This crops the input image with the provided coordinates: .. automethod:: PIL.Image.Image.effect_spread .. automethod:: PIL.Image.Image.entropy .. automethod:: PIL.Image.Image.filter -.. automethod:: PIL.Image.Image.frombytes This blurs the input image using a filter from the ``ImageFilter`` module: @@ -173,6 +172,7 @@ This blurs the input image using a filter from the ``ImageFilter`` module: # Blur the input image using the filter ImageFilter.BLUR im_blurred = im.filter(filter=ImageFilter.BLUR) +.. automethod:: PIL.Image.Image.frombytes .. automethod:: PIL.Image.Image.getbands This helps to get the bands of the input image: From 9c09a975df31306356f27755e008cf95423844e4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 23 Feb 2021 23:08:44 +1100 Subject: [PATCH 16/79] Corrected syntax [ci skip] --- docs/handbook/writing-your-own-file-decoder.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index 03b4ca601..9b670dba8 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -269,7 +269,7 @@ decoder that can be used to read various packed formats into a floating point image memory. To use the bit decoder with the :py:func:`PIL.Image.frombytes` function, use -the following syntax:: +the following syntax: .. code-block:: python From 48ac517c8d48bbb3062dcbf0d7d2866dd78368a1 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Wed, 24 Feb 2021 07:02:42 -0800 Subject: [PATCH 17/79] Fix suspicious sequence of types castings --- src/libImaging/Jpeg2KEncode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Jpeg2KEncode.c b/src/libImaging/Jpeg2KEncode.c index 5829cf37f..6e7c0a75d 100644 --- a/src/libImaging/Jpeg2KEncode.c +++ b/src/libImaging/Jpeg2KEncode.c @@ -385,7 +385,7 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) { float *pq; if (len > 0) { - if ((unsigned)len > + if ((ssize_t)len > sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0])) { len = sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0]); } From 71f48e19b949740275a4ba0475c6d41a21266c57 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Wed, 24 Feb 2021 08:15:25 -0800 Subject: [PATCH 18/79] Use unsigned size_t --- src/libImaging/Jpeg2KEncode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Jpeg2KEncode.c b/src/libImaging/Jpeg2KEncode.c index 6e7c0a75d..2e6b5daf0 100644 --- a/src/libImaging/Jpeg2KEncode.c +++ b/src/libImaging/Jpeg2KEncode.c @@ -385,7 +385,7 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) { float *pq; if (len > 0) { - if ((ssize_t)len > + if ((size_t)len > sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0])) { len = sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0]); } From 80e570bb9927f173065769b7ef1c21409729e953 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Feb 2021 23:41:31 +1100 Subject: [PATCH 19/79] Added context managers --- docs/reference/Image.rst | 68 ++++++++++++------------ docs/reference/ImageDraw.rst | 26 ++++----- docs/reference/ImageMath.rst | 8 +-- docs/reference/c_extension_debugging.rst | 4 +- 4 files changed, 53 insertions(+), 53 deletions(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index a3df6b75f..c4e8f37a3 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -22,8 +22,8 @@ Windows). .. code-block:: python from PIL import Image - im = Image.open("hopper.jpg") - im.rotate(45).show() + with Image.open("hopper.jpg") as im: + im.rotate(45).show() Create thumbnails ^^^^^^^^^^^^^^^^^ @@ -40,9 +40,9 @@ current directory preserving aspect ratios with 128x128 max resolution. for infile in glob.glob("*.jpg"): file, ext = os.path.splitext(infile) - im = Image.open(infile) - im.thumbnail(size) - im.save(file + ".thumbnail", "JPEG") + with Image.open(infile) as im: + im.thumbnail(size) + im.save(file + ".thumbnail", "JPEG") Functions --------- @@ -145,15 +145,15 @@ This crops the input image with the provided coordinates: from PIL import Image - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # The crop method from the Image module takes four coordinates as input. - # The right can also be represented as (left+width) - # and lower can be represented as (upper+height). - (left, upper, right, lower) = (20, 20, 100, 100) + # The crop method from the Image module takes four coordinates as input. + # The right can also be represented as (left+width) + # and lower can be represented as (upper+height). + (left, upper, right, lower) = (20, 20, 100, 100) - # Here the image "im" is cropped and assigned to new variable im_crop - im_crop = im.crop((left, upper, right, lower)) + # Here the image "im" is cropped and assigned to new variable im_crop + im_crop = im.crop((left, upper, right, lower)) .. automethod:: PIL.Image.Image.draft @@ -167,10 +167,10 @@ This blurs the input image using a filter from the ``ImageFilter`` module: from PIL import Image, ImageFilter - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # Blur the input image using the filter ImageFilter.BLUR - im_blurred = im.filter(filter=ImageFilter.BLUR) + # Blur the input image using the filter ImageFilter.BLUR + im_blurred = im.filter(filter=ImageFilter.BLUR) .. automethod:: PIL.Image.Image.frombytes .. automethod:: PIL.Image.Image.getbands @@ -181,8 +181,8 @@ This helps to get the bands of the input image: from PIL import Image - im = Image.open("hopper.jpg") - print(im.getbands()) # Returns ('R', 'G', 'B') + with Image.open("hopper.jpg") as im: + print(im.getbands()) # Returns ('R', 'G', 'B') .. automethod:: PIL.Image.Image.getbbox @@ -192,9 +192,9 @@ This helps to get the bounding box coordinates of the input image: from PIL import Image - im = Image.open("hopper.jpg") - print(im.getbbox()) - # Returns four coordinates in the format (left, upper, right, lower) + with Image.open("hopper.jpg") as im: + print(im.getbbox()) + # Returns four coordinates in the format (left, upper, right, lower) .. automethod:: PIL.Image.Image.getchannel .. automethod:: PIL.Image.Image.getcolors @@ -222,11 +222,11 @@ This resizes the given image from ``(width, height)`` to ``(width/2, height/2)`` from PIL import Image - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # Provide the target width and height of the image - (width, height) = (im.width // 2, im.height // 2) - im_resized = im.resize((width, height)) + # Provide the target width and height of the image + (width, height) = (im.width // 2, im.height // 2) + im_resized = im.resize((width, height)) .. automethod:: PIL.Image.Image.rotate @@ -236,12 +236,12 @@ This rotates the input image by ``theta`` degrees counter clockwise: from PIL import Image - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # Rotate the image by 60 degrees counter clockwise - theta = 60 - # Angle is in degrees counter clockwise - im_rotated = im.rotate(angle=theta) + # Rotate the image by 60 degrees counter clockwise + theta = 60 + # Angle is in degrees counter clockwise + im_rotated = im.rotate(angle=theta) .. automethod:: PIL.Image.Image.save .. automethod:: PIL.Image.Image.seek @@ -260,12 +260,12 @@ This flips the input image by using the :data:`FLIP_LEFT_RIGHT` method. from PIL import Image - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # Flip the image from left to right - im_flipped = im.transpose(method=Image.FLIP_LEFT_RIGHT) - # To flip the image from top to bottom, - # use the method "Image.FLIP_TOP_BOTTOM" + # Flip the image from left to right + im_flipped = im.transpose(method=Image.FLIP_LEFT_RIGHT) + # To flip the image from top to bottom, + # use the method "Image.FLIP_TOP_BOTTOM" .. automethod:: PIL.Image.Image.verify diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 57d1c2dda..6a7ad70cc 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -81,24 +81,24 @@ Example: Draw Partial Opacity Text from PIL import Image, ImageDraw, ImageFont # get an image - base = Image.open("Pillow/Tests/images/hopper.png").convert("RGBA") + with Image.open("Pillow/Tests/images/hopper.png").convert("RGBA") as base: - # make a blank image for the text, initialized to transparent text color - txt = Image.new("RGBA", base.size, (255,255,255,0)) + # make a blank image for the text, initialized to transparent text color + txt = Image.new("RGBA", base.size, (255,255,255,0)) - # get a font - fnt = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", 40) - # get a drawing context - d = ImageDraw.Draw(txt) + # get a font + fnt = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", 40) + # get a drawing context + d = ImageDraw.Draw(txt) - # draw text, half opacity - d.text((10,10), "Hello", font=fnt, fill=(255,255,255,128)) - # draw text, full opacity - d.text((10,60), "World", font=fnt, fill=(255,255,255,255)) + # draw text, half opacity + d.text((10,10), "Hello", font=fnt, fill=(255,255,255,128)) + # draw text, full opacity + d.text((10,60), "World", font=fnt, fill=(255,255,255,255)) - out = Image.alpha_composite(base, txt) + out = Image.alpha_composite(base, txt) - out.show() + out.show() Example: Draw Multiline Text ---------------------------- diff --git a/docs/reference/ImageMath.rst b/docs/reference/ImageMath.rst index 821f60cf5..63f88fddd 100644 --- a/docs/reference/ImageMath.rst +++ b/docs/reference/ImageMath.rst @@ -15,11 +15,11 @@ Example: Using the :py:mod:`~PIL.ImageMath` module from PIL import Image, ImageMath - im1 = Image.open("image1.jpg") - im2 = Image.open("image2.jpg") + with Image.open("image1.jpg") as im1: + with Image.open("image2.jpg") as im2: - out = ImageMath.eval("convert(min(a, b), 'L')", a=im1, b=im2) - out.save("result.png") + out = ImageMath.eval("convert(min(a, b), 'L')", a=im1, b=im2) + out.save("result.png") .. py:function:: eval(expression, environment) diff --git a/docs/reference/c_extension_debugging.rst b/docs/reference/c_extension_debugging.rst index 893acc699..527b9d7bc 100644 --- a/docs/reference/c_extension_debugging.rst +++ b/docs/reference/c_extension_debugging.rst @@ -63,8 +63,8 @@ Take your test image, and make a really simple harness. :: from PIL import Image - im = Image.open(path) - im.load() + with Image.open(path) as im: + im.load() - Run this through valgrind, but note that python triggers some issues on its own, so you're looking for items within the Pillow hierarchy From 3e670d7737bad0eedd959b8b8d989ed10d0fd625 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 26 Feb 2021 20:59:11 +1100 Subject: [PATCH 20/79] Migrated from deprecated numpy bool and float --- Tests/test_numpy.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 550d02eea..def7adf3f 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -31,7 +31,7 @@ def test_numpy_to_image(): return i # Check supported 1-bit integer formats - assert_image(to_image(numpy.bool, 1, 1), "1", TEST_IMAGE_SIZE) + assert_image(to_image(bool, 1, 1), "1", TEST_IMAGE_SIZE) assert_image(to_image(numpy.bool8, 1, 1), "1", TEST_IMAGE_SIZE) # Check supported 8-bit integer formats @@ -65,7 +65,7 @@ def test_numpy_to_image(): to_image(numpy.int64) # Check floating-point formats - assert_image(to_image(numpy.float), "F", TEST_IMAGE_SIZE) + assert_image(to_image(float), "F", TEST_IMAGE_SIZE) with pytest.raises(TypeError): to_image(numpy.float16) assert_image(to_image(numpy.float32), "F", TEST_IMAGE_SIZE) @@ -191,7 +191,7 @@ def test_putdata(): def test_roundtrip_eye(): for dtype in ( - numpy.bool, + bool, numpy.bool8, numpy.int8, numpy.int16, @@ -199,7 +199,7 @@ def test_roundtrip_eye(): numpy.uint8, numpy.uint16, numpy.uint32, - numpy.float, + float, numpy.float32, numpy.float64, ): @@ -218,7 +218,7 @@ def test_zero_size(): def test_bool(): # https://github.com/python-pillow/Pillow/issues/2044 - a = numpy.zeros((10, 2), dtype=numpy.bool) + a = numpy.zeros((10, 2), dtype=bool) a[0][0] = True im2 = Image.fromarray(a) From 5f92636bd07268a552a4b0d49f4c717918b38a1d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 27 Feb 2021 00:33:23 +1100 Subject: [PATCH 21/79] Removed comment --- src/PIL/ImageShow.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index 1ada8252c..fceb65378 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -69,7 +69,6 @@ class Viewer: Converts the given image to the target format and displays it. """ - # save temporary image to disk if not ( image.mode in ("1", "RGBA") or (self.format == "PNG" and image.mode in ("I;16", "LA")) From cf5b9a77b378b23659e4b707fbec0a52afb7baa2 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:22:26 +0100 Subject: [PATCH 22/79] Add Valgrind GHA --- .github/workflows/test-valgrind.yml | 72 +++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 .github/workflows/test-valgrind.yml diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml new file mode 100644 index 000000000..fa7f459b6 --- /dev/null +++ b/.github/workflows/test-valgrind.yml @@ -0,0 +1,72 @@ +name: Test Valgrind + +# like the docker tests, but running valgrind only on *.c/*.h changes. + +on: + push: + paths: + - "**.yml" # testing, remove me + - "**.c" + - "**.h" + pull_request + paths: + - "**.yml" # testing, remove me + - "**.c" + - "**.h" + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + docker: [ + ubuntu-20.04-focal-amd64-valgrind, + ] + dockerTag: [master] + + name: ${{ matrix.docker }} + + steps: + - uses: actions/checkout@v2 + + - name: Build system information + run: python3 .github/workflows/system-info.py + + - name: Docker pull + run: | + docker pull pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} + + - name: Docker build + run: | + # The Pillow user in the docker container is UID 1000 + sudo chown -R 1000 $GITHUB_WORKSPACE + docker run --name pillow_container -v $GITHUB_WORKSPACE:/Pillow pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} + sudo chown -R runner $GITHUB_WORKSPACE + + - name: After success + run: | + PATH="$PATH:~/.local/bin" + docker start pillow_container + pil_path=`docker exec pillow_container /vpy3/bin/python -c 'import os, PIL;print(os.path.realpath(os.path.dirname(PIL.__file__)))'` + docker stop pillow_container + sudo mkdir -p $pil_path + sudo cp src/PIL/*.py $pil_path + .ci/after_success.sh + env: + MATRIX_DOCKER: ${{ matrix.docker }} + + - name: Upload coverage + uses: codecov/codecov-action@v1 + with: + flags: GHA_Docker + name: ${{ matrix.docker }} + + success: + needs: build + runs-on: ubuntu-latest + name: Valgrind Test Successful + steps: + - name: Success + run: echo Valgrind Test Successful From ba1555a48562722b8c5738a076ce0f569a2d467f Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:31:43 +0100 Subject: [PATCH 23/79] syntax --- .github/workflows/test-valgrind.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml index fa7f459b6..9e2a90898 100644 --- a/.github/workflows/test-valgrind.yml +++ b/.github/workflows/test-valgrind.yml @@ -8,7 +8,7 @@ on: - "**.yml" # testing, remove me - "**.c" - "**.h" - pull_request + pull_request: paths: - "**.yml" # testing, remove me - "**.c" From f194d9e6e220ef4f7eedae3d824e8ff0ef068abf Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:46:19 +0100 Subject: [PATCH 24/79] Keep errors if they're "known" --- .github/workflows/cifuzz.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index 04fc152a0..fbfd673c0 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -12,15 +12,22 @@ jobs: language: python dry-run: false - name: Run Fuzzers + id: run uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master with: oss-fuzz-project-name: 'pillow' fuzz-seconds: 600 language: python dry-run: false - - name: Upload Crash - uses: actions/upload-artifact@v1 + - name: Upload New Crash + uses: actions/upload-artifact@v2 if: failure() && steps.build.outcome == 'success' with: name: artifacts path: ./out/artifacts + - name: Upload Legacy Crash + uses: actions/upload-artifact@v2 + if: steps.run.outcome == 'success': + with: + name: crash + path: ./out/crash* From 061012c46aca37fe30ad960171b999b031e2c04b Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:52:52 +0100 Subject: [PATCH 25/79] Stage Title Change --- .github/workflows/test-valgrind.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml index 9e2a90898..52174d18d 100644 --- a/.github/workflows/test-valgrind.yml +++ b/.github/workflows/test-valgrind.yml @@ -38,7 +38,7 @@ jobs: run: | docker pull pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} - - name: Docker build + - name: Build and Run Valgrind run: | # The Pillow user in the docker container is UID 1000 sudo chown -R 1000 $GITHUB_WORKSPACE From 2d52a9fcf20a0e601da0ec5d990d4db909c69265 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:54:33 +0100 Subject: [PATCH 26/79] Syntax --- .github/workflows/cifuzz.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index fbfd673c0..076f5300d 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -27,7 +27,7 @@ jobs: path: ./out/artifacts - name: Upload Legacy Crash uses: actions/upload-artifact@v2 - if: steps.run.outcome == 'success': + if: steps.run.outcome == 'success' with: name: crash path: ./out/crash* From 3c2893cdf1625700dd8fecf79e24feed9f92909d Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 12:00:18 +0100 Subject: [PATCH 27/79] No coverage from the valgrind run --- .github/workflows/test-valgrind.yml | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml index 52174d18d..be5881a51 100644 --- a/.github/workflows/test-valgrind.yml +++ b/.github/workflows/test-valgrind.yml @@ -45,24 +45,6 @@ jobs: docker run --name pillow_container -v $GITHUB_WORKSPACE:/Pillow pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} sudo chown -R runner $GITHUB_WORKSPACE - - name: After success - run: | - PATH="$PATH:~/.local/bin" - docker start pillow_container - pil_path=`docker exec pillow_container /vpy3/bin/python -c 'import os, PIL;print(os.path.realpath(os.path.dirname(PIL.__file__)))'` - docker stop pillow_container - sudo mkdir -p $pil_path - sudo cp src/PIL/*.py $pil_path - .ci/after_success.sh - env: - MATRIX_DOCKER: ${{ matrix.docker }} - - - name: Upload coverage - uses: codecov/codecov-action@v1 - with: - flags: GHA_Docker - name: ${{ matrix.docker }} - success: needs: build runs-on: ubuntu-latest From 95884c6b2d99364ba9424671dad0c4253e989d30 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 12:54:38 +0100 Subject: [PATCH 28/79] Riun on .c/.h --- .github/workflows/cifuzz.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index 076f5300d..96506fabe 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -1,5 +1,16 @@ name: CIFuzz -on: [push,pull_request] +on: + push: + paths: + - "**.yml" # testing, remove me + - "**.c" + - "**.h" + pull_request: + paths: + - "**.yml" # testing, remove me + - "**.c" + - "**.h" + jobs: Fuzzing: runs-on: ubuntu-latest From f74d0465748174b94ef7cedcdf54999b540517e7 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 28 Feb 2021 17:09:27 +0100 Subject: [PATCH 29/79] Removing the .yml files from the triggers --- .github/workflows/test-valgrind.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml index be5881a51..7b8474d0f 100644 --- a/.github/workflows/test-valgrind.yml +++ b/.github/workflows/test-valgrind.yml @@ -5,12 +5,10 @@ name: Test Valgrind on: push: paths: - - "**.yml" # testing, remove me - "**.c" - "**.h" pull_request: paths: - - "**.yml" # testing, remove me - "**.c" - "**.h" From aa0b982ef61b1ee4df7ff312b097c1e4ca36eae4 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 28 Feb 2021 17:17:33 +0100 Subject: [PATCH 30/79] Added failure if out/crash-* exists --- .github/workflows/cifuzz.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index 96506fabe..e158bd84d 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -42,3 +42,8 @@ jobs: with: name: crash path: ./out/crash* + - name: Fail on legacy crash + if: success() + run: | + [ ! -e out/crash-* ] + echo No legacy crash detected From 3fee28eb9479bf7d59e0fa08068f9cc4a6e2f04c Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 3 Jan 2021 21:35:32 +0100 Subject: [PATCH 31/79] Incorrect error code checking in TiffDecode.c * since Pillow 8.1.0 * CVE-2021-25289 --- ...-0e16d3bfb83be87356d026d66919deaefca44dac.tif | Bin 0 -> 4567 bytes ...-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif | Bin 0 -> 4221 bytes Tests/test_tiff_crashes.py | 2 ++ src/libImaging/TiffDecode.c | 3 +-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 Tests/images/crash-0e16d3bfb83be87356d026d66919deaefca44dac.tif create mode 100644 Tests/images/crash-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif diff --git a/Tests/images/crash-0e16d3bfb83be87356d026d66919deaefca44dac.tif b/Tests/images/crash-0e16d3bfb83be87356d026d66919deaefca44dac.tif new file mode 100644 index 0000000000000000000000000000000000000000..f59aab21afe39d2926aad3eeb896b7d147d510f5 GIT binary patch literal 4567 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 Il8QY0FD*Gu-2eap literal 0 HcmV?d00001 diff --git a/Tests/images/crash-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif b/Tests/images/crash-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif new file mode 100644 index 0000000000000000000000000000000000000000..c8d6e2aada30caad02b460a088519afaec3706d8 GIT binary patch literal 4221 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 literal 0 HcmV?d00001 diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index d0de4b305..eb2533466 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -24,6 +24,8 @@ from .helper import on_ci "Tests/images/crash_1.tif", "Tests/images/crash_2.tif", "Tests/images/crash-2020-10-test.tif", + "Tests/images/crash-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif", + "Tests/images/crash-0e16d3bfb83be87356d026d66919deaefca44dac.tif", ], ) @pytest.mark.filterwarnings("ignore:Possibly corrupt EXIF data") diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 7f14b5a34..2f92824c3 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -282,8 +282,7 @@ _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { img.row_offset = state->y; rows_to_read = min(rows_per_strip, img.height - state->y); - if (TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read) == - -1) { + if (!TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read)) { TRACE(("Decode Error, y: %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; goto decodeycbcr_err; From 4853e522bddbec66022c0915b9a56255d0188bf9 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 2 Jan 2021 16:07:36 +0100 Subject: [PATCH 32/79] Fix OOB read in SgiRleDecode.c * From Pillow 4.3.0->8.1.0 * CVE-2021-25293 --- ...5703f71a0f0094873a3e0e82c9f798161171b8.sgi | Bin 0 -> 13703 bytes ...834657ee604b8797bf99eac6a194c124a9a8ba.sgi | Bin 0 -> 12789 bytes ...4d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi | Bin 0 -> 549 bytes ...cf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi | Bin 0 -> 21017 bytes ...2e64d4f3f76d7465b6af535283029eda211259.sgi | Bin 0 -> 18364 bytes ...b2595b8b0b92cc5f38b6635e98e3a119ade807.sgi | Bin 0 -> 12748 bytes ...8bfa78b19721225425530c5946217720d7df4e.sgi | Bin 0 -> 12744 bytes Tests/test_sgi_crash.py | 7 ++ src/libImaging/SgiRleDecode.c | 91 +++++++++++++++--- 9 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi create mode 100644 Tests/images/crash-64834657ee604b8797bf99eac6a194c124a9a8ba.sgi create mode 100644 Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi create mode 100644 Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi create mode 100644 Tests/images/crash-b82e64d4f3f76d7465b6af535283029eda211259.sgi create mode 100644 Tests/images/crash-c1b2595b8b0b92cc5f38b6635e98e3a119ade807.sgi create mode 100644 Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi diff --git a/Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi b/Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi new file mode 100644 index 0000000000000000000000000000000000000000..81ae1182391fcfe8adfab2bb029cb68e90d95342 GIT binary patch literal 13703 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 literal 0 HcmV?d00001 diff --git a/Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi b/Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi new file mode 100644 index 0000000000000000000000000000000000000000..8e093bdfd72c786e508ca80f703f6b35b4f01573 GIT binary patch literal 549 zcmZR)#mLCO%)khQ%nT6lA4=1Q+WCTsJ{Cc2VUl2AV3G!6IUpb8V=!h+2Ks*l1Kgn! J%)}VS005jE1;zjX literal 0 HcmV?d00001 diff --git a/Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi b/Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi new file mode 100644 index 0000000000000000000000000000000000000000..790cb37449eab15d127dedb85a7f67e4b74f0d74 GIT binary patch literal 21017 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 z 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 S^Q3AyOqwhX7k(xzRR0SwB${6U literal 0 HcmV?d00001 diff --git a/Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi b/Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi new file mode 100644 index 0000000000000000000000000000000000000000..b02aacea9c387eccca911b300cf836a46b11da89 GIT binary patch literal 12744 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 literal 0 HcmV?d00001 diff --git a/Tests/test_sgi_crash.py b/Tests/test_sgi_crash.py index ac304aab4..d4ddc12f9 100644 --- a/Tests/test_sgi_crash.py +++ b/Tests/test_sgi_crash.py @@ -11,6 +11,13 @@ from PIL import Image "Tests/images/sgi_crash.bin", "Tests/images/crash-6b7f2244da6d0ae297ee0754a424213444e92778.sgi", "Tests/images/ossfuzz-5730089102868480.sgi", + "Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi", + "Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi", + "Tests/images/crash-64834657ee604b8797bf99eac6a194c124a9a8ba.sgi", + "Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi", + "Tests/images/crash-b82e64d4f3f76d7465b6af535283029eda211259.sgi", + "Tests/images/crash-c1b2595b8b0b92cc5f38b6635e98e3a119ade807.sgi", + "Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi", ], ) def test_crashes(test_file): diff --git a/src/libImaging/SgiRleDecode.c b/src/libImaging/SgiRleDecode.c index c19231e02..4eef44ba5 100644 --- a/src/libImaging/SgiRleDecode.c +++ b/src/libImaging/SgiRleDecode.c @@ -25,12 +25,58 @@ read4B(UINT32 *dest, UINT8 *buf) { *dest = (UINT32)((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]); } +/* + SgiRleDecoding is done in a single channel row oriented set of RLE chunks. + + * The file is arranged as + - SGI Header + - Rle Offset Table + - Rle Length Table + - Scanline Data + + * Each RLE atom is c->bpc bytes wide (1 or 2) + + * Each RLE Chunk is [specifier atom] [ 1 or n data atoms ] + + * Copy Atoms are a byte with the high bit set, and the low 7 are + the number of bytes to copy from the source to the + destination. e.g. + + CBBBBBBBB or 0CHLHLHLHLHLHL (B=byte, H/L = Hi low bytes) + + * Run atoms do not have the high bit set, and the low 7 bits are + the number of copies of the next atom to copy to the + destination. e.g.: + + RB -> BBBBB or RHL -> HLHLHLHLHL + + The upshot of this is, there is no way to determine the required + length of the input buffer from reloffset and rlelength without + going through the data at that scan line. + + Furthermore, there's no requirement that individual scan lines + pointed to from the rleoffset table are in any sort of order or + used only once, or even disjoint. There's also no requirement that + all of the data in the scan line area of the image file be used + + */ static int -expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { +expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize, UINT8 *end_of_buffer) { + /* + * n here is the number of rlechunks + * z is the number of channels, for calculating the interleave + * offset to go to RGBA style pixels + * xsize is the row width + * end_of_buffer is the address of the end of the input buffer + */ + UINT8 pixel, count; int x = 0; for (; n > 0; n--) { + if (src > end_of_buffer) { + return -1; + } pixel = *src++; if (n == 1 && pixel != 0) { return n; @@ -44,12 +90,18 @@ expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { } x += count; if (pixel & RLE_COPY_FLAG) { + if (src + count > end_of_buffer) { + return -1; + } while (count--) { *dest = *src++; dest += z; } } else { + if (src > end_of_buffer) { + return -1; + } pixel = *src++; while (count--) { *dest = pixel; @@ -61,12 +113,14 @@ expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { } static int -expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize) { +expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize, UINT8 *end_of_buffer) { UINT8 pixel, count; - int x = 0; for (; n > 0; n--) { + if (src + 1 > end_of_buffer) { + return -1; + } pixel = src[1]; src += 2; if (n == 1 && pixel != 0) { @@ -81,12 +135,18 @@ expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize) { } x += count; if (pixel & RLE_COPY_FLAG) { + if (src + 2 * count > end_of_buffer) { + return -1; + } while (count--) { memcpy(dest, src, 2); src += 2; dest += z * 2; } } else { + if (src + 2 > end_of_buffer) { + return -1; + } while (count--) { memcpy(dest, src, 2); dest += z * 2; @@ -132,7 +192,11 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t return -1; } _imaging_seek_pyFd(state->fd, SGI_HEADER_SIZE, SEEK_SET); - _imaging_read_pyFd(state->fd, (char *)ptr, c->bufsize); + if (_imaging_read_pyFd(state->fd, (char *)ptr, c->bufsize) != c->bufsize) { + state->errcode = IMAGING_CODEC_UNKNOWN; + return -1; + } + /* decoder initialization */ state->count = 0; @@ -166,20 +230,20 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t read4B(&c->lengthtab[c->tabindex], &ptr[c->bufindex]); } - state->count += c->tablen * sizeof(UINT32) * 2; - /* read compressed rows */ for (c->rowno = 0; c->rowno < im->ysize; c->rowno++, state->y += state->ystep) { for (c->channo = 0; c->channo < im->bands; c->channo++) { c->rleoffset = c->starttab[c->rowno + c->channo * im->ysize]; c->rlelength = c->lengthtab[c->rowno + c->channo * im->ysize]; - c->rleoffset -= SGI_HEADER_SIZE; - if (c->rleoffset + c->rlelength > c->bufsize) { + // Check for underflow of rleoffset-SGI_HEADER_SIZE + if (c->rleoffset < SGI_HEADER_SIZE) { state->errcode = IMAGING_CODEC_OVERRUN; goto sgi_finish_decode; } + c->rleoffset -= SGI_HEADER_SIZE; + /* row decompression */ if (c->bpc == 1) { status = expandrow( @@ -187,14 +251,16 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t &ptr[c->rleoffset], c->rlelength, im->bands, - im->xsize); + im->xsize, + &ptr[c->bufsize-1]); } else { status = expandrow2( &state->buffer[c->channo * 2], &ptr[c->rleoffset], c->rlelength, im->bands, - im->xsize); + im->xsize, + &ptr[c->bufsize-1]); } if (status == -1) { state->errcode = IMAGING_CODEC_OVERRUN; @@ -203,15 +269,12 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t goto sgi_finish_decode; } - state->count += c->rlelength; } /* store decompressed data in image */ state->shuffle((UINT8 *)im->image[state->y], state->buffer, im->xsize); } - c->bufsize++; - sgi_finish_decode:; free(c->starttab); @@ -221,5 +284,5 @@ sgi_finish_decode:; state->errcode = err; return -1; } - return state->count - c->bufsize; + return 0; } From 86f02f7c70862a0954bfe8133736d352db978eaa Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 8 Jan 2021 18:45:42 +0100 Subject: [PATCH 33/79] Fix negative size read in TiffDecode.c * Caught by oss-fuzz runs * CVE-2021-25290 --- ...-0c7e0e8e11ce787078f00b5b0ca409a167f070e0.tif | Bin 0 -> 2529 bytes ...-1185209cf7655b5aed8ae5e77784dfdd18ab59e9.tif | Bin 0 -> 1931 bytes ...-338516dbd2f0e83caddb8ce256c22db3bd6dc40f.tif | Bin 0 -> 4682 bytes ...-4f085cc12ece8cde18758d42608bed6a2a2cfb1c.tif | Bin 0 -> 4050 bytes ...-86214e58da443d2b80820cff9677a38a33dcbbca.tif | Bin 0 -> 286 bytes ...-f46f5b2f43c370fe65706c11449f567ecc345e74.tif | Bin 0 -> 1844 bytes Tests/test_tiff_crashes.py | 8 +++++++- src/libImaging/TiffDecode.c | 4 ++++ 8 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Tests/images/crash-0c7e0e8e11ce787078f00b5b0ca409a167f070e0.tif create mode 100644 Tests/images/crash-1185209cf7655b5aed8ae5e77784dfdd18ab59e9.tif create mode 100644 Tests/images/crash-338516dbd2f0e83caddb8ce256c22db3bd6dc40f.tif create mode 100644 Tests/images/crash-4f085cc12ece8cde18758d42608bed6a2a2cfb1c.tif create mode 100644 Tests/images/crash-86214e58da443d2b80820cff9677a38a33dcbbca.tif create mode 100644 Tests/images/crash-f46f5b2f43c370fe65706c11449f567ecc345e74.tif diff --git a/Tests/images/crash-0c7e0e8e11ce787078f00b5b0ca409a167f070e0.tif b/Tests/images/crash-0c7e0e8e11ce787078f00b5b0ca409a167f070e0.tif new file mode 100644 index 0000000000000000000000000000000000000000..5275075e9177155cfa0fcc91bb783e237116ddba GIT binary patch literal 2529 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 literal 0 HcmV?d00001 diff --git a/Tests/images/crash-338516dbd2f0e83caddb8ce256c22db3bd6dc40f.tif b/Tests/images/crash-338516dbd2f0e83caddb8ce256c22db3bd6dc40f.tif new file mode 100644 index 0000000000000000000000000000000000000000..344d62b277a85e4dd8262d31b175958efd0e768f GIT binary patch literal 4682 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 T?|*bELLzInhh(yaEK@2|njzbib;y=I3Mq^T zWn!#}7Fn{#SjIAD=6>&pkN^Rb zB3vMT^BCObfEfwb-SCV2t>=N6`!{pLEQsLzC(0Vk`+nLT zQgHTM{}%{O{2xJZAUV0Xd3Nyb+yy(-?D@5|NDfXU7Z)cd>>UN$0jD6>-b1PVc zu(q+iV0Y2p!QI2t%lmI1-=N@->!D%cH*Vj#8;iSlKQ1XbC6)N-aa#J5y!?W~qNl|r z)z4ql)YiSMCxv``=vRC7j~0wxi)_DULqiy`{;T5sesXOt%83g59w%1XeNi^!1h27pugQm3HVbb-Re0zb0eX=LRp3`iQL6>F zwkl$o6*uX{VY8%bGr1uY+~v17otlHsRygau4Y|-5;`B1+I+oVH<`}?#qG(@8Z3Z^+ zl(^UPKzt&OQ|QI9?tpG1s?73F=dT768dc>#L>(A~p(A2~t1r95C5Ls|4S45WoKnXP zMKvQtG$$*2=oo%A#W`_#t%+=e44&j{wB&NOv~BT5&y_UEj1YIvsJ;5%96ppF0)b+q z@N}u*m(Yrmi?ipA$o!aE~_nS#8kv=WDWs^*OW?xm1rEpiOtfmQ=a)>G8)&i4KGZmwj8#|&506Ifq|pLnrnHO87c0HF*TZG*sd^Hs zh2)+hZ}NO>szj!oYppjWsOL^bJa&{|y<_qco2VQo%B~%J1CoS;k%i%J=9ipAzQ`W6 zW{c@Ai)dRD`b=hmGa_m(mk3sMA0X>JyOHdob4j^KGt)M4lCn#}!L&Wu4TEYqf-H&2 z;d{G|qVX#f@!ch;KdFiKT5}~PUdqn$ao=TpkA2~+(KNp9JdaLS6xZ&ZSrRS{5jHb& z7Sy0!PNDr{ev2}<>vU$qxs0S`q7>eCjCopK_|Z3=h);MvMR=kAgw3>)_Piy5{w6wk zlrBg1-NbkEqgJZP7_}c&Qo;{(JvhQA&X$>)RT*Yb4`$l6jr)F`t5Ln|?~*rSxZ&iz_KjHFQ^cEEIT95g#!&Uo|aH)d~kYy^g4ohCsPXzNh_V zoYMDl_w0hBoul{De9+n3$)YOp_0lgvC{GatDjGL#6^R>?rL(go`z&3Cis#e!S{xz_ z^S1NSkziv%8)av6d|*H$t}($fy*luD&pZ}8Ila&!`ZbfkzI&-~B8^W`jd z_r6i&rD{;cdRr{>ZOXc4`r{=!DM55}Ym;2WnIn6v{XXxlIva)rsJ&tD=lH@0pWAn2 z75zQGdZK;Gx_~Q6UEgZFF2Q!P?yeW+o0@(m>0t%O!=U!w5whMm|Iu~r^k8YNPP(CF z6Xtwae$LkneM!u|@OfRCt;FWDTKf^#!Y9ac3e&5o>5;Pmfej@3X7*3Tpy2XjS6J8! zI!_milDvHQn;l*E>WI$A=X@V(yS+Ch?Ts%h2B)U1gO7I~2z_P{#p@TXcd| zG2Zk*;MDOapI;}=j+Jz(_HER5@RhzE))6X;(QI8pYU_NTz(YXy@%KE3D@mQX@9$+< z5Jn>&f2_+bx-V)4{uIJ?ZKrsU+*j5o3)eqwXmY9`V}6 zkpnWQ_z1h1GW7c8YHyQt}R%O5YUnAs9{iMU@e8TZwG zQQ70~!~+KQwZ-2< z_FT*6wx!v}DN)Ewybt}ecpU<*2Iw&yjxDtr)ZC;v7^#LHalI6jJ0I;( zc7g5eFItyJy!bim15a1~@vTu5ZBb14*%nd!c)`vJJFBddrSl;QOVOih>&gf7-stnC zxVoixXS~r>NcEAEz4~)F)4T0m;z#~8?3lvS20hN&z=D@G={>?R+SwdQ z9fg05wlufTr?0MH1;a>u1WL8v1hG-98ZYf+;E2K8_mQ2VQm<`=@&)iqEMvIGeaC$I zo~GmsCI<|TpuJT5Kd|Z`5OY2lcnbF|vp96JiZ+46P4w|LA?|#xAnFcCK+rN^bq;+E_@Bb`qHA zSbsos!8h?nnhhBWhgCT%8J`?*me6D!Ry8i4k@WhhXM2y;ektR!)>ZA@e9>|w+IncK zvPgLXJ%I$R?S7oTCOS<$ZK^{^wl0`>cGY73^e_zQ87JxQD1R$=cWUtGz%pic-1 z$=rWR|{eHK4t-!-(Hv`Q@Iaz@^5^H5uw);#v z>r4hJMVoBs1`4P98eRtz9b;X~)TlD7Z=VjHk9Csr`b-#d@(X&UkaWJO)Y?SJHQxQm z?kJtDYaKeAl6i49E1Rp%s)yqoXB)ep^m*R#mPa0y&YfH_l88l1Uip}7Vx7=XLAAHN zxfJ)+tJce9Jyt-1$1(_Sx8Kt=v$$S+j)+TrtUi#%q)MLA7^VniP2*R-taWUd zm_=uso7!H^el^nZzMFp|WAJ&ezG{J7n&ir9ZJh~iDvdOzQ`uFOTJVA1n|ex;{%yms znr8Y~^Ckc#9(5Evf?60b`>|o?pvpPJj(Qv+$(uZjC(@qe%yFAb%X6EK`awW`9iG9d zZG!|${Dk<$o|glHb_r=z;1NGOIZ=ofW2qd>Q=k1R`Eh?~wSHyWji(`r_NO%a-%SkN zT1sdqyL8Hm1e!0rk}UIeP?GbYrqd}OiDP*uZ`!|d&)NQ#Hcmd-GVVGiMkwF?^|V4E zU9&;!M+Yu>N)ENWBB?gtAxV#yR=?xxaOPs$g}Bg1Or6CMUL`TVR+*bz(wlb4vk!Sz z%SxtSi>ET}_YG0H)L-vH=KYRp25s4549D)d>AOaczyO9XEffNL2!1gbLz@*41 z{XGO8R~n|VRASgtUqad35J;e47*ptVUz(c0xb2!+`Lc@Dz_vpx+sFz6&a)868S1_q zjco2Be)?_Xo-HY3D-XX) z#wT{(me`8IVw0Jz)h)(eU#U5PZSuCXZB!Z-N7o<0r8`5QgMw|8V#g>1lNnnsEZ!>% z)#MGP)`v}fGTTf9yZn5<5=UM^^JjHP_+Pv6y22q5nmxNT*z_e0>_gZtPH zDV8iLZ}eFQGs~p~vwcWch5d-)GGi6%($)%rp&AI}=k<&wY@wz|^l1qAn=Rtnv75}> z>;`}G+R4g!WibeZKB5n>aLN!!3}&5U=3?KtpeM_iYVZ_L5SaZdb;~6Iy`--S??g$o z_ZV9p+em`|EBp~Vh5DYLu!!zwD$ri({lScT)GAcfgPoYczQV3M+`~%T$Wm|8&R!B= zh9_)TL%_2#2it-b8`CX`M60Z-O>TFwmm$z|S6)vo>Csz)2m}UIwnxVxL7DqG%kbRSuy8v+Eh-BvbN2HQJyjJmm*z(z0$(IN4l zr&?kc7}PhUIU#m^0xPL0fce+@Q>I)MyblzsB6?*}XJ`RiCb*xiXt9xn6@(90I?GOW zGjE=eH`*hd+XDc21{8{kZaAuykZoiS}H%pM(b&&CSJ7a4Eg zXV0>2$1k&wVefS~u?uMiV6&>djs zF^Dj+GJx#-2E@hf>fCMX26l7DXq96#Zje!cIr-xMx6vT25Kyf--5sz;{>SjMvaG>ikJW!$Zjy-${07)SR1tk)HcQ( z4b(Ja+|VxqYD4Z}=xjy^z#juZ9n_Y7SO6si2A~)mF!YhY_~COHFb9vUGZaB1epm)i z12GBVW&*%0rI7UyH88&j;))SdhI)8}X$k;O z;T4o90CHOZ)HDDtI{}dG2Ecs=oY*qh*9+$O0N@<}`>h3l&j(;86aZ2L0Oy1Nly8B( z;{cdQ0N_j_+)n|3^97vrhh?~jVHSELAN~(tKcF85YXA|CC*W~J0)apx5ltzm8HG%y z*jawG0Clim=;&ZiqdB>G(4AbCy3%Nj74A!yd$QT=g>)b8O4ce5FE-2Y5`;t|QOFcq zGc#M3GtHUxzfIo;7Q)lxkPikA{=pCo)&z$q5J{$Fm~h>~@Ec(9f)2FUH1SPE7uxeWRP1 z{qybIyq;9-;l@wUg9Aj>`?knLcJtkR9q6SsEvu*QS^DMtWYPTK2>LRen^IG9>;9pc z;zG|EhF6TeDlf(1s*HGdH`jJl`{Qkq&!Wt`-;|EE5D2;VmrT1})m6r;<6BvU-J85( zEs{6g8)JX(%{>?w{I)N>wsf$w(N#YPziu<25`hKs1dF%;3>Cpr5&aOLU=iqGsUQI8 z+^YrVI6=vab1&1PLg=z&M3uFtOe7zv+%nuK%V_^}S$jnNjgXdKU0mj`wy)XYLQb;U zJaVav)y4{q?|NqD-=E62->X~QF)p$h+D7dhe?-pdovCCi?}VNFp&^5xzM+uzMp}`w zxRdLn9F%*ER}Jlo*0vokJiEVd%(^C6#`|)nsg>A*zu;S1{c-oWFs=NGcX3T-dr;=J zfXsf6hDMdSmifrhmC*ySWJ81h zk*Jo(zw}kA!mFyh17AhFn$L)x+MT-pA+Me+YO?kEXOP5yALO{*M*5Y?T3H&;>dvf> zL|frnec65J)sdrL{GJsM%TOYx#k;9pcHM7#c+M0jrJY9SQdFZ!?MOM4-T#V*HU~xL zK9z76TxL)E_X+}u=fZUd#UKF4TjD{R_{d;Vf^H)K&*2w!!?zvdINbJv_GL zM7jD+vtJA{$$S=6a2xXk8Im%0P91X)#oZjyY}*){S}zI=ug6H2xK&?V96Hk6zi19s zBo0d%72=S$t;^{T%S!L&)pnubGW%r{^OxUS#)ZWAT})qcv9>W^%e~`W|4x&nP;z%C z+jN!FEeleE+_$RdcS@PZ$yxr9tu)-K{1m23%BjS#V$6-?`-JH)p$$nQSizWo@3FbK#2_p0Ar0Pxihdgv==s9zO9VX;q+xe0W zv#1~tzpuP5TfhTgv@nbkDT$Cc5ZQu2$GoT893^>6IqBql*Y6tNt+?5g+3$N@Zf+HJ zfT5^WMhgb|LI*C?h#sA_!ul)DJ33x#7+ZA^74Yn9loc > state->eof) { + TIFFError("_tiffReadProc", "Invalid Read at loc %d, eof: %d", state->loc, state->eof); + return 0; + } to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc); TRACE(("to_read: %d\n", (int)to_read)); From cbdce6c5d054fccaf4af34b47f212355c64ace7a Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 23 Jan 2021 11:36:50 +0100 Subject: [PATCH 34/79] Fix for CVE-2021-25291 * Invalid tile boundaries lead to OOB Read in TiffDecode.c, in TiffReadRGBATile * Check the tile validity before attempting to read. --- ...-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif | Bin 0 -> 3728 bytes Tests/test_tiff_crashes.py | 1 + src/libImaging/TiffDecode.c | 9 +++++++++ 3 files changed, 10 insertions(+) create mode 100644 Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif diff --git a/Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif b/Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif new file mode 100644 index 0000000000000000000000000000000000000000..b89203f75c40ec004e9a37d04caa7ba1c1aee085 GIT binary patch literal 3728 zcmeHJU1%It6h3!mvTpv`ByO`93yvFYX=!$6XE$kfZ6s;hz-p~OK@3R2jY-?2NmJ8> zjc-AP2=&E06@}uHeGrl2OCJPr5%*;&6!gLBQy&6aDB6cgtnB!mnR_Rb%_deNis%{c z+%sp+J^%OIo6GH|FcGy05;_TB5i&?foI*f6&~zi@d`bJ;NE4c2G&DFKTomp+EkD&% zRS4#a1W9_oo5*p9mZolzZVU*WwK7yrR4SMp=T=Ty)lAB&kO5R$#r&GYK_*?|`xePH z*pnxyT^Q8;;@JQPd+M%~rtFm~3oo6XDnJ20tO$>0+|^t=A?@SpZ=wo|B`E7!eCys} zRLc4uT#XoG*N8gHn)NX74}eF@8X`;7AMc}w%7WVHQ~C__t}@~c`p-M@0(43njUfI>%v;5I+IPT8rqk(1 z_GSk9?L&4dex1^;&>F}5&pMF_kbJg3LO3Fwo*94cJwBN|dp_0YzE3zr{&(MIxXXTG(aweFu2q5&b*1C%7uHE>JLu?kFs_56Tz<_i3PIox33E7 z2xMZtaF6FBsQ#gP&v84n(AH%!iEpAngTR-F1}cPhyoua``XdJCmfg{oDiyiuy~AqL zgNjQJoXWyhY>j4!W7D}7RP5S-tJoD#D7E?8&RL`6hEX8Dz!vXRQfKZ)KV0iBVAo`Q zlTbl^I@$C(@GaAV9r@-WXNjv0^$CACGr8P1&Z^`5x_XzZwHtlbNxN}8^SM)PM(eO_ zGZ{~&`z_l(VA@vFPFM#M$=;r1f7a^Drh82Zu_v3%L-P|Sv!h2w%!Sz*bi{d?kc;A< zZhCNdv%IQ3acmK>;39S}R~#bVF&!jNM=qDK;hCw?!u%AtaBjYkFQPTv-`T2)4g7xF zb7`!y(N}q!RdQb-8W9GjY2t*~u*|#id4ueNKQB4*}vc-xz#-kD*kV?d<*#3wb_Z21F_SE!ntfBQ7jhY#iT8}fqQFScctFg kya%~|*K6LjQtkNM{Ha7TlgT73J7L>BX!bqlU(XEu4zt$kbpQYW literal 0 HcmV?d00001 diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index 4e68c5c55..ae4d0f100 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -32,6 +32,7 @@ from .helper import on_ci "Tests/images/crash-4f085cc12ece8cde18758d42608bed6a2a2cfb1c.tif", "Tests/images/crash-86214e58da443d2b80820cff9677a38a33dcbbca.tif", "Tests/images/crash-f46f5b2f43c370fe65706c11449f567ecc345e74.tif", + "Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif", ], ) @pytest.mark.filterwarnings("ignore:Possibly corrupt EXIF data") diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 099f9ea65..14a685df8 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -562,6 +562,15 @@ ImagingLibTiffDecode( for (y = state->yoff; y < state->ysize; y += tile_length) { for (x = state->xoff; x < state->xsize; x += tile_width) { + /* Sanity Check. Apparently in some cases, the TiffReadRGBA* functions + have a different view of the size of the tiff than we're getting from + other functions. So, we need to check here. + */ + if (!TIFFCheckTile(tiff, x, y, 0, 0)) { + TRACE(("Check Tile Error, Tile at %dx%d\n", x, y)); + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } if (isYCbCr) { /* To avoid dealing with YCbCr subsampling, let libtiff handle it */ if (!TIFFReadRGBATile(tiff, x, y, (UINT32 *)state->buffer)) { From 3bce145966374dd39ce58a6fc0083f8d1890719c Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Jan 2021 15:53:09 +0200 Subject: [PATCH 35/79] Use more specific regex chars to prevent ReDoS * CVE-2021-25292 --- src/PIL/PdfParser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index 975905f96..86d78a95c 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -580,8 +580,9 @@ class PdfParser: whitespace_or_hex = br"[\000\011\012\014\015\0400-9a-fA-F]" whitespace_optional = whitespace + b"*" whitespace_mandatory = whitespace + b"+" + whitespace_optional_no_nl = br"[\000\011\014\015\040]*" # no "\012" aka "\n" newline_only = br"[\r\n]+" - newline = whitespace_optional + newline_only + whitespace_optional + newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl re_trailer_end = re.compile( whitespace_mandatory + br"trailer" From 3f2b7d71402ff70cb873cadfe7379350da64b72c Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 28 Feb 2021 18:13:16 +0100 Subject: [PATCH 36/79] Release notes for 8.1.1 --- docs/releasenotes/8.1.1.rst | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/releasenotes/8.1.1.rst diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst new file mode 100644 index 000000000..7ee2b67a8 --- /dev/null +++ b/docs/releasenotes/8.1.1.rst @@ -0,0 +1,32 @@ +8.1.1 +----- + + +Security +======== + +CVE-2021-25289: The previous fix for CVE-2020-35654 was insufficent +due to incorrect error checking in TiffDecode.c. + +CVE-2021-25290: In TiffDecode.c, there is a negative-offset memcpy +with an invalid size + +CVE-2021-25291: In TiffDecode.c, invalid tile boundaries could lead to +an OOB Read in TiffReadRGBATile + +CVE-2021-25292: The PDF parser has a catastrophic backtracking regex +that could be used as a DOS attack. + +CVE-2021-25293: There is an Out of Bounds Read in SGIRleDecode.c, +since pillow 4.3.0. + +There is an Exhaustion of Memory DOS in the ICNS, ICO, and BLP +container formats where Pillow did not properly check the reported +size of the contained image. These images could cause arbitrariliy +large memory allocations. + + +Other Changes +============= + +A crash with the feature flags for LibJpeg and Webp on unreleased Python 3.10 has been fixed (https://github.com/python-pillow/Pillow/issues/5193) From c96eac1ca43ff48120fe0adf901f33f36a0301d6 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 28 Feb 2021 18:19:17 +0100 Subject: [PATCH 37/79] Credits --- docs/releasenotes/8.1.1.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 7ee2b67a8..6483a4f4b 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -23,7 +23,8 @@ since pillow 4.3.0. There is an Exhaustion of Memory DOS in the ICNS, ICO, and BLP container formats where Pillow did not properly check the reported size of the contained image. These images could cause arbitrariliy -large memory allocations. +large memory allocations. This was reported by Jiayi Lin, Luke +Shaffer, Xinran Xie, and Akshay Ajayan of ASU.edu. Other Changes From fb4ae1ee3c7532857199654c8ced45ab396dc325 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 1 Mar 2021 19:20:52 +1100 Subject: [PATCH 38/79] Update CHANGES.rst [ci skip] --- CHANGES.rst | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b4d6b5348..e2073d867 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,12 +20,30 @@ Changelog (Pillow) - Support for ignoring tests when running valgrind #5150 [wiredfool, radarhere, hugovk] -- PyModule_AddObject fix for Python 3.10 #5194 - [radarhere] - - OSS-Fuzz support #5189 [wiredfool, radarhere] +8.1.1 (2020-03-01) +------------------ + +- Use more specific regex chars to prevent ReDoS. CVE-2021-25292 + [hugovk] + +- Fix OOB Read in TiffDecode.c, and check the tile validity before reading. CVE-2021-25291 + [wiredfool] + +- Fix negative size read in TiffDecode.c. CVE-2021-25290 + [wiredfool] + +- Fix OOB read in SgiRleDecode.c. CVE-2021-25293 + [wiredfool] + +- Incorrect error code checking in TiffDecode.c. CVE-2021-25289 + [wiredfool] + +- PyModule_AddObject fix for Python 3.10 #5194 + [radarhere] + 8.1.0 (2020-01-02) ------------------ From a80cf4227570a5e5148d8e9fb76366f3e3790405 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 1 Mar 2021 19:22:57 +1100 Subject: [PATCH 39/79] Added 8.1.1 release notes to index --- docs/releasenotes/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 0930768e7..38aed08cf 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -15,6 +15,7 @@ expected to be backported to earlier versions. :maxdepth: 2 8.2.0 + 8.1.1 8.1.0 8.0.1 8.0.0 From 3c96fbf908b735a58bd39e663c5d5ad7350bbf5a Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 1 Mar 2021 21:03:26 +0100 Subject: [PATCH 40/79] Removed "Remove me" testing lines --- .github/workflows/cifuzz.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index e158bd84d..9fe8f774f 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -2,12 +2,10 @@ name: CIFuzz on: push: paths: - - "**.yml" # testing, remove me - "**.c" - "**.h" pull_request: paths: - - "**.yml" # testing, remove me - "**.c" - "**.h" From 8e887b62ac3d02493d5666aa7ea190ecb417adb0 Mon Sep 17 00:00:00 2001 From: heitbaum Date: Tue, 2 Mar 2021 20:09:23 +1100 Subject: [PATCH 41/79] CHANGES.rst: update dates --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index e2073d867..923142a61 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -23,7 +23,7 @@ Changelog (Pillow) - OSS-Fuzz support #5189 [wiredfool, radarhere] -8.1.1 (2020-03-01) +8.1.1 (2021-03-01) ------------------ - Use more specific regex chars to prevent ReDoS. CVE-2021-25292 @@ -44,7 +44,7 @@ Changelog (Pillow) - PyModule_AddObject fix for Python 3.10 #5194 [radarhere] -8.1.0 (2020-01-02) +8.1.0 (2021-01-02) ------------------ - Fix TIFF OOB Write error. CVE-2020-35654 #5175 From 915f68967fd6de16b16b75a68dccd4ac30168c6f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 2 Mar 2021 13:16:14 +0200 Subject: [PATCH 42/79] Update release notes formatting, links, spelling --- docs/conf.py | 4 ++++ docs/releasenotes/8.1.0.rst | 10 +++++----- docs/releasenotes/8.1.1.rst | 28 +++++++++++++++------------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 4fb9d1f8f..123e93c9b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -312,3 +312,7 @@ def setup(app): app.add_js_file("js/script.js") app.add_css_file("css/dark.css") app.add_css_file("css/light.css") + + +# GitHub repo for sphinx-issues +issues_github_path = "python-pillow/Pillow" diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 5c4ee3773..c5fc26226 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -18,7 +18,7 @@ vulnerability introduced in FreeType 2.6 (:cve:`CVE-2020-15999`). Makefile ^^^^^^^^ -The 'install-venv' target has been deprecated. +The ``install-venv`` target has been deprecated. API Additions ============= @@ -48,15 +48,15 @@ Thanks to Google's `OSS-Fuzz`_ project for finding this. * :cve:`CVE-2020-35654` Fix TIFF OOB Write error -OOB Write in TiffDecode.c when reading corrupt YCbCr files in some LibTIFF versions +OOB Write in ``TiffDecode.c`` when reading corrupt YCbCr files in some LibTIFF versions (4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases LibTIFF's interpretation of the file is different when reading in RGBA mode, leading to an Out of -bounds write in TiffDecode.c. This potentially affects Pillow versions from 6.0.0 to +bounds write in ``TiffDecode.c``. This potentially affects Pillow versions from 6.0.0 to 8.0.1, depending on the version of LibTIFF. This was reported through `Tidelift`_. * :cve:`CVE-2020-35655` Fix for SGI Decode buffer overrun -4 byte read overflow in SGIRleDecode.c, where the code was not correctly checking the +4 byte read overflow in ``SGIRleDecode.c``, where the code was not correctly checking the offsets and length tables. Independently reported through `Tidelift`_ and Google's `OSS-Fuzz`_. This vulnerability covers Pillow versions 4.3.0->8.0.1. @@ -78,7 +78,7 @@ Other Changes Makefile ^^^^^^^^ -The 'co' target has been removed. +The ``co`` target has been removed. PyPy wheels ^^^^^^^^^^^ diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 6483a4f4b..51a81c7a6 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -5,29 +5,31 @@ Security ======== -CVE-2021-25289: The previous fix for CVE-2020-35654 was insufficent -due to incorrect error checking in TiffDecode.c. +:cve:`CVE-2021-25289`: The previous fix for :cve:`CVE-2020-35654` was insufficient +due to incorrect error checking in ``TiffDecode.c``. -CVE-2021-25290: In TiffDecode.c, there is a negative-offset memcpy -with an invalid size +:cve:`CVE-2021-25290`: In ``TiffDecode.c``, there is a negative-offset ``memcpy`` +with an invalid size. -CVE-2021-25291: In TiffDecode.c, invalid tile boundaries could lead to -an OOB Read in TiffReadRGBATile +:cve:`CVE-2021-25291`: In ``TiffDecode.c``, invalid tile boundaries could lead to +an out-of-bounds read in ``TIFFReadRGBATile``. -CVE-2021-25292: The PDF parser has a catastrophic backtracking regex +:cve:`CVE-2021-25292`: The PDF parser has a catastrophic backtracking regex that could be used as a DOS attack. -CVE-2021-25293: There is an Out of Bounds Read in SGIRleDecode.c, -since pillow 4.3.0. +:cve:`CVE-2021-25293`: There is an out-of-bounds read in ``SgiRleDecode.c``, +since Pillow 4.3.0. -There is an Exhaustion of Memory DOS in the ICNS, ICO, and BLP +There is an exhaustion of memory DOS in the ICNS, ICO, and BLP container formats where Pillow did not properly check the reported -size of the contained image. These images could cause arbitrariliy +size of the contained image. These images could cause arbitrarily large memory allocations. This was reported by Jiayi Lin, Luke -Shaffer, Xinran Xie, and Akshay Ajayan of ASU.edu. +Shaffer, Xinran Xie, and Akshay Ajayan of +`Arizona State University `_. Other Changes ============= -A crash with the feature flags for LibJpeg and Webp on unreleased Python 3.10 has been fixed (https://github.com/python-pillow/Pillow/issues/5193) +A crash with the feature flags for libjpeg and WebP on unreleased Python 3.10 has been +fixed (:issue:`5193`). From b41dab0e9b8a0b8bb0fa3118e8a06b7dc05ba1cf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 2 Mar 2021 23:22:06 +1100 Subject: [PATCH 43/79] Expanded "OOB" to "out-of-bounds" [ci skip] --- docs/releasenotes/7.1.0.rst | 2 +- docs/releasenotes/8.1.0.rst | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/releasenotes/7.1.0.rst b/docs/releasenotes/7.1.0.rst index fd3627e3c..0024a537d 100644 --- a/docs/releasenotes/7.1.0.rst +++ b/docs/releasenotes/7.1.0.rst @@ -74,7 +74,7 @@ Security This release includes security fixes. -* :cve:`CVE-2020-10177` Fix multiple OOB reads in FLI decoding +* :cve:`CVE-2020-10177` Fix multiple out-of-bounds reads in FLI decoding * :cve:`CVE-2020-10378` Fix bounds overflow in PCX decoding * :cve:`CVE-2020-10379` Fix two buffer overflows in TIFF decoding * :cve:`CVE-2020-10994` Fix bounds overflow in JPEG 2000 decoding diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index c5fc26226..17074d486 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -46,13 +46,14 @@ The PCX image decoder used the reported image stride to calculate the row buffer rather than calculating it from the image size. This issue dates back to the PIL fork. Thanks to Google's `OSS-Fuzz`_ project for finding this. -* :cve:`CVE-2020-35654` Fix TIFF OOB Write error +* :cve:`CVE-2020-35654` Fix TIFF out-of-bounds write error -OOB Write in ``TiffDecode.c`` when reading corrupt YCbCr files in some LibTIFF versions -(4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases LibTIFF's -interpretation of the file is different when reading in RGBA mode, leading to an Out of -bounds write in ``TiffDecode.c``. This potentially affects Pillow versions from 6.0.0 to -8.0.1, depending on the version of LibTIFF. This was reported through `Tidelift`_. +Out-of-bounds write in ``TiffDecode.c`` when reading corrupt YCbCr files in some +LibTIFF versions (4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases +LibTIFF's interpretation of the file is different when reading in RGBA mode, leading to +an out-of-bounds write in ``TiffDecode.c``. This potentially affects Pillow versions +from 6.0.0 to 8.0.1, depending on the version of LibTIFF. This was reported through +`Tidelift`_. * :cve:`CVE-2020-35655` Fix for SGI Decode buffer overrun From f676b10813ef16141bc7f6bff050384a3960a471 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 3 Mar 2021 07:56:29 +1100 Subject: [PATCH 44/79] Updated libimagequant to 2.14.1 --- depends/install_imagequant.sh | 2 +- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index e204ea9ad..376d8ef9b 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.14.0 +archive=libimagequant-2.14.1 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/docs/installation.rst b/docs/installation.rst index 4610d87d8..ec39c9fa8 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -177,7 +177,7 @@ Many of Pillow's features require external libraries: * **libimagequant** provides improved color quantization - * Pillow has been tested with libimagequant **2.6-2.14** + * Pillow has been tested with libimagequant **2.6-2.14.1** * Libimagequant is licensed GPLv3, which is more restrictive than the Pillow license, therefore we will not be distributing binaries with libimagequant support enabled. From 333fd06e9075b483046dd59aa0474d34fa3224ca Mon Sep 17 00:00:00 2001 From: nulano Date: Tue, 2 Mar 2021 23:19:20 +0100 Subject: [PATCH 45/79] update libimagequant in winbuild --- winbuild/build_prepare.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 2f7c858bc..7b561aa4e 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -255,10 +255,10 @@ deps = { "libs": [r"bin\*.lib"], }, "libimagequant": { - # e5d454b: Merge tag '2.12.6' into msvc - "url": "https://github.com/ImageOptim/libimagequant/archive/e5d454bc7f5eb63ee50c84a83a7fa5ac94f68ec4.zip", # noqa: E501 - "filename": "libimagequant-e5d454bc7f5eb63ee50c84a83a7fa5ac94f68ec4.zip", - "dir": "libimagequant-e5d454bc7f5eb63ee50c84a83a7fa5ac94f68ec4", + # Merge master into msvc (matches 2.14.1 except for version bump) + "url": "https://github.com/ImageOptim/libimagequant/archive/16adaded22d1f90db5c9154a06d00a8b672ca09a.zip", # noqa: E501 + "filename": "libimagequant-16adaded22d1f90db5c9154a06d00a8b672ca09a.zip", + "dir": "libimagequant-16adaded22d1f90db5c9154a06d00a8b672ca09a", "patch": { "CMakeLists.txt": { "add_library": "add_compile_options(-openmp-)\r\nadd_library", From d0cf8ffef5012b4fb9766b7974beb9e7f2f4b88b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 3 Mar 2021 10:47:21 +0200 Subject: [PATCH 46/79] Fix filename spelling Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- docs/releasenotes/8.1.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 17074d486..8ed1d9d85 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -57,7 +57,7 @@ from 6.0.0 to 8.0.1, depending on the version of LibTIFF. This was reported thro * :cve:`CVE-2020-35655` Fix for SGI Decode buffer overrun -4 byte read overflow in ``SGIRleDecode.c``, where the code was not correctly checking the +4 byte read overflow in ``SgiRleDecode.c``, where the code was not correctly checking the offsets and length tables. Independently reported through `Tidelift`_ and Google's `OSS-Fuzz`_. This vulnerability covers Pillow versions 4.3.0->8.0.1. From b959ee7885fbca24ebe001531c799addde14881b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 3 Mar 2021 20:34:52 +1100 Subject: [PATCH 47/79] Corrected list of relevant dependencies [ci skip] --- docs/releasenotes/8.1.1.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 51a81c7a6..40add51b0 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -31,5 +31,5 @@ Shaffer, Xinran Xie, and Akshay Ajayan of Other Changes ============= -A crash with the feature flags for libjpeg and WebP on unreleased Python 3.10 has been -fixed (:issue:`5193`). +A crash with the feature flags for libimagequant, libjpegturbo, WebP and XCB on +unreleased Python 3.10 has been fixed (:issue:`5193`). From 944fd834dbc271859f5f0b44a2c75b7a15ed90a4 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 3 Mar 2021 22:38:24 +1100 Subject: [PATCH 48/79] Updated spelling [ci skip] Co-authored-by: Hugo van Kemenade --- docs/releasenotes/8.1.1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 40add51b0..f5c2ed90c 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -31,5 +31,5 @@ Shaffer, Xinran Xie, and Akshay Ajayan of Other Changes ============= -A crash with the feature flags for libimagequant, libjpegturbo, WebP and XCB on +A crash with the feature flags for libimagequant, libjpeg-turbo, WebP and XCB on unreleased Python 3.10 has been fixed (:issue:`5193`). From 852fd170f8f3bb45cb0a7709d62bbc52b568d8bc Mon Sep 17 00:00:00 2001 From: Luke Granger-Brown Date: Wed, 3 Mar 2021 13:30:28 +0000 Subject: [PATCH 49/79] Fix -Wformat error in TiffDecode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit src/libImaging/TiffDecode.c: In function ‘_tiffReadProc’: src/libImaging/TiffDecode.c:59:58: error: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘toff_t’ {aka ‘long unsigned int’} [-Werror=format=] src/libImaging/TiffDecode.c:59:67: error: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘toff_t’ {aka ‘long unsigned int’} [-Werror=format=] --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 14a685df8..a67091921 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -56,7 +56,7 @@ _tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) { dump_state(state); if (state->loc > state->eof) { - TIFFError("_tiffReadProc", "Invalid Read at loc %d, eof: %d", state->loc, state->eof); + TIFFError("_tiffReadProc", "Invalid Read at loc %lu, eof: %lu", state->loc, state->eof); return 0; } to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc); From 346bfc95375fe9441f904af21af1e6ddb3d2898d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 08:55:24 +1100 Subject: [PATCH 50/79] Added IPythonViewer --- Tests/test_imageshow.py | 18 +++++++++++++++++- src/PIL/ImageShow.py | 15 +++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Tests/test_imageshow.py b/Tests/test_imageshow.py index 78e80f521..5981e22c0 100644 --- a/Tests/test_imageshow.py +++ b/Tests/test_imageshow.py @@ -62,4 +62,20 @@ def test_viewer(): def test_viewers(): for viewer in ImageShow._viewers: - viewer.get_command("test.jpg") + try: + viewer.get_command("test.jpg") + except NotImplementedError: + pass + + +def test_ipythonviewer(): + pytest.importorskip("IPython", reason="IPython not installed") + for viewer in ImageShow._viewers: + if isinstance(viewer, ImageShow.IPythonViewer): + test_viewer = viewer + break + else: + assert False + + im = hopper() + assert test_viewer.show(im) == 1 diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index fceb65378..9e7614144 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -225,6 +225,21 @@ if sys.platform not in ("win32", "darwin"): # unixoids if shutil.which("xv"): register(XVViewer) + +class IPythonViewer(Viewer): + def show_image(self, image, **options): + display(image) + return 1 + + +try: + from IPython.display import display +except ImportError: + pass +else: + register(IPythonViewer) + + if __name__ == "__main__": if len(sys.argv) < 2: From f067fe4c05bfed6e20257c3c54f77ade8547de86 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 08:56:03 +1100 Subject: [PATCH 51/79] Added import alias for clarity --- src/PIL/ImageShow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index 9e7614144..bb04c4e29 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -228,12 +228,12 @@ if sys.platform not in ("win32", "darwin"): # unixoids class IPythonViewer(Viewer): def show_image(self, image, **options): - display(image) + ipython_display(image) return 1 try: - from IPython.display import display + from IPython.display import display as ipython_display except ImportError: pass else: From 5e0a4acb85bd3ea1dd2d41e25bc4616fde15b138 Mon Sep 17 00:00:00 2001 From: Kipkurui Mutai Date: Sun, 28 Feb 2021 19:50:27 +0300 Subject: [PATCH 52/79] Update ImageShow.rst --- docs/reference/ImageShow.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/reference/ImageShow.rst b/docs/reference/ImageShow.rst index a30a6caed..f1fbd90ce 100644 --- a/docs/reference/ImageShow.rst +++ b/docs/reference/ImageShow.rst @@ -9,6 +9,7 @@ All default viewers convert the image to be shown to PNG format. .. autofunction:: PIL.ImageShow.show +.. autoclass:: IPythonViewer .. autoclass:: WindowsViewer .. autoclass:: MacViewer From 7b094638094986a7506efb310b6dcbe72675276b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 08:56:49 +1100 Subject: [PATCH 53/79] Added IPythonViewer docstring --- src/PIL/ImageShow.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index bb04c4e29..3368865a4 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -227,6 +227,8 @@ if sys.platform not in ("win32", "darwin"): # unixoids class IPythonViewer(Viewer): + """The viewer for IPython frontends.""" + def show_image(self, image, **options): ipython_display(image) return 1 From a1463ff211c37a026135894487d13f7c908ed8ce Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 08:59:47 +1100 Subject: [PATCH 54/79] Added release notes --- docs/releasenotes/8.2.0.rst | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 28d39ca46..f27f295a7 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -21,10 +21,17 @@ TODO API Additions ============= -TODO -^^^^ +ImageShow.IPythonViewer +^^^^^^^^^^^^^^^^^^^^^^^ -TODO +If IPython is present, this new ``ImageShow.Viewer`` subclass will be +registered. It displays images on all IPython frontends. This will be helpful +to users of Google Colab, allowing ``im.show()`` to display images. + +It is lower in priority than the other default Viewer instances, so it will +only be used by ``im.show()`` or ``ImageShow.show()`` if none of the other +viewers are available. This means that the behaviour of ``ImageShow`` will stay +the same for most Pillow users. Security ======== From b885af93cb56a9e73be58440b6f217e94e3cc45e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 17:33:47 +1100 Subject: [PATCH 55/79] Added more CVE numbers [ci skip] --- docs/releasenotes/8.1.1.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index f5c2ed90c..90a786ec4 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -20,11 +20,11 @@ that could be used as a DOS attack. :cve:`CVE-2021-25293`: There is an out-of-bounds read in ``SgiRleDecode.c``, since Pillow 4.3.0. -There is an exhaustion of memory DOS in the ICNS, ICO, and BLP -container formats where Pillow did not properly check the reported -size of the contained image. These images could cause arbitrarily -large memory allocations. This was reported by Jiayi Lin, Luke -Shaffer, Xinran Xie, and Akshay Ajayan of +There is an exhaustion of memory DOS in the BLP (:cve:`CVE-2021-27921`), +ICNS (:cve:`CVE-2021-27922`) and ICO (:cve:`CVE-2021-27923`) container formats +where Pillow did not properly check the reported size of the contained image. +These images could cause arbitrarily large memory allocations. This was reported +by Jiayi Lin, Luke Shaffer, Xinran Xie, and Akshay Ajayan of `Arizona State University `_. From 480f6819b592d7f07b9a9a52a7656c10bbe07442 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 24 Feb 2021 23:27:07 +0100 Subject: [PATCH 56/79] Fix Memory DOS in Icns, Ico and Blp Image Plugins Some container plugins that could contain images of other formats, such as the ICNS format, did not properly check the reported size of the contained image. These images could cause arbitrariliy large memory allocations. This is fixed for all locations where individual *ImageFile classes are created without going through the usual Image.open method. --- ...d3316a4109213ca96fb8a256a0bfefdece1461.icns | Bin 0 -> 240915 bytes Tests/test_file_icns.py | 6 ++++++ src/PIL/BlpImagePlugin.py | 1 + src/PIL/IcnsImagePlugin.py | 2 ++ src/PIL/IcoImagePlugin.py | 1 + 5 files changed, 10 insertions(+) create mode 100644 Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns diff --git a/Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns b/Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns new file mode 100644 index 0000000000000000000000000000000000000000..0521f5cf176fd6c774b7e58a7f450dbc369644a9 GIT binary patch literal 240915 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ℑ?Ji*~_)TXvunaHt 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index fef2329bc..ea022332c 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -140,3 +140,9 @@ def test_not_an_icns_file(): with io.BytesIO(b"invalid\n") as fp: with pytest.raises(SyntaxError): IcnsImagePlugin.IcnsFile(fp) + + +def test_icns_decompression_bomb(): + with pytest.raises(Image.DecompressionBombError): + im = Image.open('Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns') + im.load() diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index d5d7c0e05..88aae80eb 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -353,6 +353,7 @@ class BLP1Decoder(_BLPBaseDecoder): data = jpeg_header + data data = BytesIO(data) image = JpegImageFile(data) + Image._decompression_bomb_check(image.size) self.tile = image.tile # :/ self.fd = image.fp self.mode = image.mode diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 2a63d75cb..ca6a0adad 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -105,6 +105,7 @@ def read_png_or_jpeg2000(fobj, start_length, size): if sig[:8] == b"\x89PNG\x0d\x0a\x1a\x0a": fobj.seek(start) im = PngImagePlugin.PngImageFile(fobj) + Image._decompression_bomb_check(im.size) return {"RGBA": im} elif ( sig[:4] == b"\xff\x4f\xff\x51" @@ -121,6 +122,7 @@ def read_png_or_jpeg2000(fobj, start_length, size): jp2kstream = fobj.read(length) f = io.BytesIO(jp2kstream) im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) + Image._decompression_bomb_check(im.size) if im.mode != "RGBA": im = im.convert("RGBA") return {"RGBA": im} diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index e1bfa7a59..5634bf8e9 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -178,6 +178,7 @@ class IcoFile: if data[:8] == PngImagePlugin._MAGIC: # png frame im = PngImagePlugin.PngImageFile(self.buf) + Image._decompression_bomb_check(im.size) else: # XOR + AND mask bmp frame im = BmpImagePlugin.DibImageFile(self.buf) From 5269ab13a760612b6bff3685f2fc83d28765b420 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Mar 2021 10:20:01 +1100 Subject: [PATCH 57/79] Lint fix --- Tests/test_file_icns.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index ea022332c..7ce8cb286 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -144,5 +144,7 @@ def test_not_an_icns_file(): def test_icns_decompression_bomb(): with pytest.raises(Image.DecompressionBombError): - im = Image.open('Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns') + im = Image.open( + "Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns" + ) im.load() From f2ea25780a97360bbe42f8c3ff1f97c97b2646cd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Mar 2021 13:21:30 +1100 Subject: [PATCH 58/79] Added release notes for 8.1.2 --- docs/releasenotes/8.1.1.rst | 8 -------- docs/releasenotes/8.1.2.rst | 12 ++++++++++++ docs/releasenotes/index.rst | 1 + 3 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 docs/releasenotes/8.1.2.rst diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 90a786ec4..4081c49ca 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -1,7 +1,6 @@ 8.1.1 ----- - Security ======== @@ -20,13 +19,6 @@ that could be used as a DOS attack. :cve:`CVE-2021-25293`: There is an out-of-bounds read in ``SgiRleDecode.c``, since Pillow 4.3.0. -There is an exhaustion of memory DOS in the BLP (:cve:`CVE-2021-27921`), -ICNS (:cve:`CVE-2021-27922`) and ICO (:cve:`CVE-2021-27923`) container formats -where Pillow did not properly check the reported size of the contained image. -These images could cause arbitrarily large memory allocations. This was reported -by Jiayi Lin, Luke Shaffer, Xinran Xie, and Akshay Ajayan of -`Arizona State University `_. - Other Changes ============= diff --git a/docs/releasenotes/8.1.2.rst b/docs/releasenotes/8.1.2.rst new file mode 100644 index 000000000..50d132f33 --- /dev/null +++ b/docs/releasenotes/8.1.2.rst @@ -0,0 +1,12 @@ +8.1.2 +----- + +Security +======== + +There is an exhaustion of memory DOS in the BLP (:cve:`CVE-2021-27921`), +ICNS (:cve:`CVE-2021-27922`) and ICO (:cve:`CVE-2021-27923`) container formats +where Pillow did not properly check the reported size of the contained image. +These images could cause arbitrarily large memory allocations. This was reported +by Jiayi Lin, Luke Shaffer, Xinran Xie, and Akshay Ajayan of +`Arizona State University `_. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 38aed08cf..117738675 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -15,6 +15,7 @@ expected to be backported to earlier versions. :maxdepth: 2 8.2.0 + 8.1.2 8.1.1 8.1.0 8.0.1 From 1d7cbeb338a6e042ad21e4e242c600200c1b5de9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Mar 2021 13:24:53 +1100 Subject: [PATCH 59/79] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 923142a61..50401e2c3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -23,6 +23,12 @@ Changelog (Pillow) - OSS-Fuzz support #5189 [wiredfool, radarhere] +8.1.2 (2021-03-06) +------------------ + +- Fix Memory DOS in BLP (CVE-2021-27921), ICNS (CVE-2021-27922) and ICO (CVE-2021-27923) Image Plugins + [wiredfool] + 8.1.1 (2021-03-01) ------------------ From 690cf9ebe2d7002eb134980cbb07ed7b113ae5bb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Mar 2021 20:54:21 +1100 Subject: [PATCH 60/79] Allow alpha_composite destination to be negative --- Tests/test_image.py | 8 ++++++-- src/PIL/Image.py | 2 -- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 73cf7bf83..de1999d3d 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -344,6 +344,12 @@ class TestImage: assert_image_equal(offset.crop((64, 64, 127, 127)), target.crop((0, 0, 63, 63))) assert offset.size == (128, 128) + # with negative offset + offset = src.copy() + offset.alpha_composite(over, (-64, -64)) + assert_image_equal(offset.crop((0, 0, 63, 63)), target.crop((64, 64, 127, 127))) + assert offset.size == (128, 128) + # offset and crop box = src.copy() box.alpha_composite(over, (64, 64), (0, 0, 32, 32)) @@ -367,8 +373,6 @@ class TestImage: source.alpha_composite(over, 0) with pytest.raises(ValueError): source.alpha_composite(over, (0, 0), 0) - with pytest.raises(ValueError): - source.alpha_composite(over, (0, -1)) with pytest.raises(ValueError): source.alpha_composite(over, (0, 0), (0, -1)) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 01fe7ed1b..d2a7c3490 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1544,8 +1544,6 @@ class Image: raise ValueError("Destination must be a 2-tuple") if min(source) < 0: raise ValueError("Source must be non-negative") - if min(dest) < 0: - raise ValueError("Destination must be non-negative") if len(source) == 2: source = source + im.size From 441a1cf9cf7a6fa018e7cecdfbd70b5680b53f26 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 19:00:57 +1100 Subject: [PATCH 61/79] Update CHANGES.rst [ci skip] --- CHANGES.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 50401e2c3..aa25e7991 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,21 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Added IPythonViewer #5289 + [radarhere, Kipkurui-mutai] + +- Only draw each rectangle outline pixel once #5183 + [radarhere] + +- Use mmap instead of built-in Win32 mapper #5224 + [radarhere, cgohlke] + +- Handle PCX images with an odd stride #5214 + [radarhere] + +- Only read different sizes for "Large Thumbnail" MPO frames #5168 + [radarhere] + - Added PyQt6 support #5258 [radarhere] From 45c43fc9112e08b050fe5322399500c60fef2d90 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 19:39:28 +1100 Subject: [PATCH 62/79] Added release notes [ci skip] --- docs/releasenotes/8.2.0.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 28d39ca46..92909cfb5 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -13,10 +13,13 @@ when Tk/Tcl 8.5 will be the minimum supported. API Changes =========== -TODO -^^^^ +Image.alpha_composite: dest +^^^^^^^^^^^^^^^^^^^^^^^^^^^ -TODO +When calling :py:meth:`~PIL.Image.Image.alpha_composite`, the ``dest`` argument now +accepts negative co-ordinates, like the upper left corner of the ``box`` argument of +:py:meth:`~PIL.Image.Image.paste` can be negative. Naturally, this has effect of +cropping the overlaid image. API Additions ============= From f5d49f4f6166625fec381dc28886258a8be19f06 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 19:53:59 +1100 Subject: [PATCH 63/79] Added rounded_rectangle method --- Tests/images/imagedraw_rounded_rectangle.png | Bin 0 -> 934 bytes Tests/test_imagedraw.py | 28 ++++++++++++ docs/reference/ImageDraw.rst | 14 ++++++ src/PIL/ImageDraw.py | 45 +++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 Tests/images/imagedraw_rounded_rectangle.png diff --git a/Tests/images/imagedraw_rounded_rectangle.png b/Tests/images/imagedraw_rounded_rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..2e815f4ada247e8302c8cc5e053a162b4fe3ed01 GIT binary patch literal 934 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k2}mkgS)OEIV9xb)aSW-L^Y+HYqE!YWZGkra z`|j^~zUcByEkULy+m*8KcJ6r0b6;iKWfq_w7JO{=uCm%MWtMrNFZA{Hn$kOmx$mrcylh_ev~WwS zgty)=UgoY9+4kq%s}Iie>-O!L=l3Kt@%*~)XYTyJsLt*EYRRoiQ~ffF50Ce5U9#%j z>c4MhiCe$nUA=YQs&jb>(YyN&-SnFD%b+*8urBrDH`(lM4Xf<@AJ06uUgws?wVYk6 z?5-Z%*7onYY+VlLYB~KI>+Eh%^j&Se=B7(%?7?^2%H&#C?dq#Ne=A={>DQrEyTiAw zUR_!9=<2SQ^JKd_`Zj3&Q?-~MRayVJ@2Sk5Woysh4fJT)&=JAC`dyqQ`}&;A_uI;J zlv-SYVgh1pg*rZu#DecshQo!%8SzkmVTE(;2wjg~sgADZUY zzLQPNopVC<%BkOdPLLSzJG}blm+ueEt;Gbb4{yqhJ-#pft}HMnx2;?7amw@XsBLc| zHh13om9u;GtUt$;Qj#OSRvcXRb!A^p_~m)B*=DiP^PeY#UN*T~w(d^Uv+T#W_ALBn zc5%;+jQ9C#u6b=+w^=&$YRQY^)!DYWbFUv*wd}9^!&`^?jtW=qlC{}=&$#%%`|oMt zH*QB+#!b5)D_i&Ca`e8IL-$;+pPvdzun)FNS@!G?Og_f*_k4A)%rW^DiIdyjMeGmF zGI)IT$Ha{r_Jx+&xQAvHSgg4Z&K>`Lal^6 Date: Mon, 22 Feb 2021 07:38:04 +1100 Subject: [PATCH 64/79] Only draw each pixel once --- .../imagedraw_rounded_rectangle_both.png | Bin 0 -> 530 bytes .../images/imagedraw_rounded_rectangle_x.png | Bin 0 -> 567 bytes .../images/imagedraw_rounded_rectangle_y.png | Bin 0 -> 528 bytes Tests/test_imagedraw.py | 24 ++++ src/PIL/ImageDraw.py | 103 +++++++++++++----- 5 files changed, 98 insertions(+), 29 deletions(-) create mode 100644 Tests/images/imagedraw_rounded_rectangle_both.png create mode 100644 Tests/images/imagedraw_rounded_rectangle_x.png create mode 100644 Tests/images/imagedraw_rounded_rectangle_y.png diff --git a/Tests/images/imagedraw_rounded_rectangle_both.png b/Tests/images/imagedraw_rounded_rectangle_both.png new file mode 100644 index 0000000000000000000000000000000000000000..24f600e3913ebc74a9c301e815f06f4ac0cfdd94 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^DIm7ZFWD}C_M}wCs{)<;eRDP)o0Zj@@g?*-%YXh2Cub>!tu2gw`02!~<0084 z-RnK1`%I^)u!s%^Wrko*Ci z>}`Huu3gs7ZhQOk`^z=c%tQ=M%qsIWS=Y?1;;o>R-BzHQ_2I-V^_n&7FNirrZ+iA| z>TR8qb5tKpF?HUtsJZ~?m)F{Rqb-XLEvk_Jv-s5<*OYTsYmCGKebp|D?4uWRojEl-z|T`s&ch> literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_rounded_rectangle_x.png b/Tests/images/imagedraw_rounded_rectangle_x.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf5211a3340d62724b64a5517693c1fa2403e7d GIT binary patch literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^DImsnv^Py)@I#H6G!aHYxGIp1VMO3=9uSE2Lu&$j^^gx8G4e{Yv2p zkI3asQ9VNDZr3i)l3N)brgi#JhWE^^-xt*;EnB3$euc-isrH`>r}fR}?p~rSHoY|G z)s>6WlCuNjBO`T#{Vi@?+BEI6=#;J5rxv}O7@MjXzmj?1v5@Su7beP23{88L@U%t0 zUOI2}narq-xt{scwG|aEzKp7;#;jQ_5L91BvpZlrp`NrOe<1yh3&3|zc8+e-t_F_ zROyHVGgTi<0ZJ_@HaK%q>b175p^DMd6%}G<*JfP{d~)X2S|jm|n^pz@L+woX(?2?D zn>h_W`!{4xVk&ixUF^)86}S4T?ZM~&{BLr5q-k>-Y>jTH`~Z%~^+)udCACbFI5_JE Oi0|p@=d#Wzp$Pyx_3|kI literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_rounded_rectangle_y.png b/Tests/images/imagedraw_rounded_rectangle_y.png new file mode 100644 index 0000000000000000000000000000000000000000..9b391b95e28ea723f75e90210945f1481d93d402 GIT binary patch literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^DIm37 zx6T&5yXNj1ekQKN^_ScyZq&GA?4T4MP&VO)CM!@M7`Rka-?Xl+W8L@TeEEa!|J}W! zQZKw>cC3i#Pr23Q@l59RM>qGrtM~54Wu6K;S{iCM`Re8c{U?e)bai zaw}?Hd1Vm3RHWIrXHFfVaZ&s7&=$$1nAL zofUm1{en% z&%y@vNY;7$Q~ax)mtGGqnm7N!^FOmL6o&p;-`r5oBlscS1QtCv}Ao?m#zm1 NdAj= x1 - x0 + if full_x: + # The two left and two right corners are joined + d = x1 - x0 + full_y = d >= y1 - y0 + if full_y: + # The two top and two bottom corners are joined + d = y1 - y0 + if full_x and full_y: + # If all corners are joined, that is a circle + return self.ellipse(xy, fill, outline, width) + if d == 0: + # If the corners have no curve, that is a rectangle return self.rectangle(xy, fill, outline, width) ink, fill = self._getink(outline, fill) + + def draw_corners(pieslice): + if full_x: + # Draw top and bottom halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 180, 360), + ((x0, y1 - d, x0 + d, y1), 0, 180), + ) + elif full_y: + # Draw left and right halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 90, 270), + ((x1 - d, y0, x1, y0 + d), 270, 90), + ) + else: + # Draw four separate corners + parts = ( + ((x1 - d, y0, x1, y0 + d), 270, 360), + ((x1 - d, y1 - d, x1, y1), 0, 90), + ((x0, y1 - d, x0 + d, y1), 90, 180), + ((x0, y0, x0 + d, y0 + d), 180, 270), + ) + for part in parts: + if pieslice: + self.draw.draw_pieslice(*(part + (fill, 1))) + else: + self.draw.draw_arc(*(part + (ink, width))) + if fill is not None: - self.draw.draw_pieslice((x1 - d, y0, x1, y0 + d), 270, 360, fill, 1) - self.draw.draw_pieslice((x1 - d, y1 - d, x1, y1), 0, 90, fill, 1) - self.draw.draw_pieslice((x0, y1 - d, x0 + d, y1), 90, 180, fill, 1) - self.draw.draw_pieslice((x0, y0, x0 + d, y0 + d), 180, 270, fill, 1) + draw_corners(True) - self.draw.draw_rectangle((x0 + d / 2 + 1, y0, x1 - d / 2 - 1, y1), fill, 1) - self.draw.draw_rectangle( - (x0, y0 + d / 2 + 1, x0 + d / 2, y1 - d / 2 - 1), fill, 1 - ) - self.draw.draw_rectangle( - (x1 - d / 2, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), fill, 1 - ) + if full_x: + self.draw.draw_rectangle( + (x0, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), fill, 1 + ) + else: + self.draw.draw_rectangle( + (x0 + d / 2 + 1, y0, x1 - d / 2 - 1, y1), fill, 1 + ) + if not full_x and not full_y: + self.draw.draw_rectangle( + (x0, y0 + d / 2 + 1, x0 + d / 2, y1 - d / 2 - 1), fill, 1 + ) + self.draw.draw_rectangle( + (x1 - d / 2, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), fill, 1 + ) if ink is not None and ink != fill and width != 0: - self.draw.draw_arc((x1 - d, y0, x1, y0 + d), 270, 360, ink, width) - self.draw.draw_arc((x1 - d, y1 - d, x1, y1), 0, 90, ink, width) - self.draw.draw_arc((x0, y1 - d, x0 + d, y1), 90, 180, ink, width) - self.draw.draw_arc((x0, y0, x0 + d, y0 + d), 180, 270, ink, width) + draw_corners(False) - self.draw.draw_rectangle( - (x1 - width + 1, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), ink, 1 - ) - self.draw.draw_rectangle( - (x0 + d / 2 + 1, y1 - width + 1, x1 - d / 2 - 1, y1), ink, 1 - ) - self.draw.draw_rectangle( - (x0, y0 + d / 2 + 1, x0 + width - 1, y1 - d / 2 - 1), ink, 1 - ) - self.draw.draw_rectangle( - (x0 + d / 2 + 1, y0, x1 - d / 2 - 1, y0 + width - 1), ink, 1 - ) + if not full_x: + self.draw.draw_rectangle( + (x0 + d / 2 + 1, y0, x1 - d / 2 - 1, y0 + width - 1), ink, 1 + ) + self.draw.draw_rectangle( + (x0 + d / 2 + 1, y1 - width + 1, x1 - d / 2 - 1, y1), ink, 1 + ) + if not full_y: + self.draw.draw_rectangle( + (x0, y0 + d / 2 + 1, x0 + width - 1, y1 - d / 2 - 1), ink, 1 + ) + self.draw.draw_rectangle( + (x1 - width + 1, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), ink, 1 + ) def _multiline_check(self, text): """Draw text.""" From 62bf920634164509f2465b2ae1d7924bc7065699 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 20:10:17 +1100 Subject: [PATCH 65/79] Added release notes [ci skip] --- docs/releasenotes/8.2.0.rst | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index f27f295a7..04d80e80e 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -13,10 +13,20 @@ when Tk/Tcl 8.5 will be the minimum supported. API Changes =========== -TODO -^^^^ +ImageDraw.rounded_rectangle +^^^^^^^^^^^^^^^^^^^^^^^^^^^ -TODO +Added :py:meth:`~PIL.ImageDraw.ImageDraw.rounded_rectangle`. It works the same as +:py:meth:`~PIL.ImageDraw.ImageDraw.rectangle`, except with an additional ``radius`` +argument. ``radius`` is limited to half of the width or the height, so that users can +create a circle, but not any other ellipse. + +.. code-block:: python + + from PIL import Image, ImageDraw + im = Image.new("RGB", (200, 200)) + draw = ImageDraw.Draw(im) + draw.rounded_rectangle(xy=(10, 20, 190, 180), radius=30, fill="red") API Additions ============= From ac1a9b28c9b7b405d6f3e52d49feebd3508706d4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 20:33:13 +1100 Subject: [PATCH 66/79] Added link to class and function [ci skip] --- docs/releasenotes/8.2.0.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index f27f295a7..d339479a5 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -24,14 +24,14 @@ API Additions ImageShow.IPythonViewer ^^^^^^^^^^^^^^^^^^^^^^^ -If IPython is present, this new ``ImageShow.Viewer`` subclass will be +If IPython is present, this new :py:class:`PIL.ImageShow.Viewer` subclass will be registered. It displays images on all IPython frontends. This will be helpful to users of Google Colab, allowing ``im.show()`` to display images. -It is lower in priority than the other default Viewer instances, so it will -only be used by ``im.show()`` or ``ImageShow.show()`` if none of the other -viewers are available. This means that the behaviour of ``ImageShow`` will stay -the same for most Pillow users. +It is lower in priority than the other default :py:class:`PIL.ImageShow.Viewer` +instances, so it will only be used by ``im.show()`` or :py:func:`.ImageShow.show()` +if none of the other viewers are available. This means that the behaviour of +:py:class:`PIL.ImageShow` will stay the same for most Pillow users. Security ======== From e7f5bb18312e6c6db1ec3cd4eec7272be094baaf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 11 Feb 2021 18:19:05 +1100 Subject: [PATCH 67/79] Ensure file is closed if it is opened by ImageQt.ImageQt --- Tests/test_imageqt.py | 13 +++++++++++-- src/PIL/ImageQt.py | 19 +++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py index 404849cb9..53b1fef7c 100644 --- a/Tests/test_imageqt.py +++ b/Tests/test_imageqt.py @@ -4,11 +4,14 @@ from PIL import ImageQt from .helper import hopper +pytestmark = pytest.mark.skipif( + not ImageQt.qt_is_installed, reason="Qt bindings are not installed" +) + if ImageQt.qt_is_installed: from PIL.ImageQt import qRgba -@pytest.mark.skipif(not ImageQt.qt_is_installed, reason="Qt bindings are not installed") def test_rgb(): # from https://doc.qt.io/archives/qt-4.8/qcolor.html # typedef QRgb @@ -38,7 +41,13 @@ def test_rgb(): checkrgb(0, 0, 255) -@pytest.mark.skipif(not ImageQt.qt_is_installed, reason="Qt bindings are not installed") def test_image(): for mode in ("1", "RGB", "RGBA", "L", "P"): ImageQt.ImageQt(hopper(mode)) + + +def test_closed_file(): + with pytest.warns(None) as record: + ImageQt.ImageQt("Tests/images/hopper.gif") + + assert not record diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 74ca3166c..56650e102 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -128,6 +128,7 @@ def align8to32(bytes, width, mode): def _toqclass_helper(im): data = None colortable = None + exclusive_fp = False # handle filename, if given instead of image name if hasattr(im, "toUtf8"): @@ -135,6 +136,7 @@ def _toqclass_helper(im): im = str(im.toUtf8(), "utf-8") if isPath(im): im = Image.open(im) + exclusive_fp = True qt_format = QImage.Format if qt_version == "6" else QImage if im.mode == "1": @@ -157,10 +159,15 @@ def _toqclass_helper(im): data = im.tobytes("raw", "BGRA") format = qt_format.Format_ARGB32 else: + if exclusive_fp: + im.close() raise ValueError(f"unsupported image mode {repr(im.mode)}") - __data = data or align8to32(im.tobytes(), im.size[0], im.mode) - return {"data": __data, "im": im, "format": format, "colortable": colortable} + size = im.size + __data = data or align8to32(im.tobytes(), size[0], im.mode) + if exclusive_fp: + im.close() + return {"data": __data, "size": size, "format": format, "colortable": colortable} if qt_is_installed: @@ -182,8 +189,8 @@ if qt_is_installed: self.__data = im_data["data"] super().__init__( self.__data, - im_data["im"].size[0], - im_data["im"].size[1], + im_data["size"][0], + im_data["size"][1], im_data["format"], ) if im_data["colortable"]: @@ -197,8 +204,8 @@ def toqimage(im): def toqpixmap(im): # # This doesn't work. For now using a dumb approach. # im_data = _toqclass_helper(im) - # result = QPixmap(im_data['im'].size[0], im_data['im'].size[1]) - # result.loadFromData(im_data['data']) + # result = QPixmap(im_data["size"][0], im_data["size"][1]) + # result.loadFromData(im_data["data"]) # Fix some strange bug that causes if im.mode == "RGB": im = im.convert("RGBA") From 666d3c5d3f2c042fef3a2f2976458a67bf72e245 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 22:21:22 +1100 Subject: [PATCH 68/79] Use bash shell for mkdir command --- .github/workflows/test-windows.yml | 2 +- .github/workflows/test.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 12c288374..32518c9d1 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -174,7 +174,7 @@ jobs: if: failure() run: | mkdir -p Tests/errors - shell: pwsh + shell: bash - name: Upload errors uses: actions/upload-artifact@v2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4064a0589..e52fefc69 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -92,7 +92,6 @@ jobs: if: failure() run: | mkdir -p Tests/errors - shell: pwsh - name: Upload errors uses: actions/upload-artifact@v2 From 7c7a68867df60e5ca668a6cc703776355c79fff6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 23:15:59 +1100 Subject: [PATCH 69/79] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index aa25e7991..3695ed964 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Ensure file is closed if it is opened by ImageQt.ImageQt #5260 + [radarhere] + +- Added ImageDraw rounded_rectangle method #5208 + [radarhere] + - Added IPythonViewer #5289 [radarhere, Kipkurui-mutai] From 21da5b1ed8e905b7f3e4198207486317304b8698 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 9 Mar 2021 07:09:50 +1100 Subject: [PATCH 70/79] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3695ed964..57e7f75cc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Allow alpha_composite destination to be negative #5313 + [radarhere] + - Ensure file is closed if it is opened by ImageQt.ImageQt #5260 [radarhere] From e54880c6528efcc41c4a942b938398c1ddcd5644 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 10 Mar 2021 13:17:19 +1100 Subject: [PATCH 71/79] Moved RGB fix inside ImageQt class --- Tests/test_qt_image_qapplication.py | 27 +++++++++++++++++++++++++-- src/PIL/ImageQt.py | 9 ++++----- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Tests/test_qt_image_qapplication.py b/Tests/test_qt_image_qapplication.py index a3d5620d3..dec790c50 100644 --- a/Tests/test_qt_image_qapplication.py +++ b/Tests/test_qt_image_qapplication.py @@ -2,18 +2,26 @@ import pytest from PIL import ImageQt -from .helper import assert_image_equal, hopper +from .helper import assert_image_equal, assert_image_equal_tofile, hopper if ImageQt.qt_is_installed: from PIL.ImageQt import QPixmap if ImageQt.qt_version == "6": + from PyQt6.QtCore import QPoint + from PyQt6.QtGui import QImage, QPainter, QRegion from PyQt6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "side6": + from PySide6.QtCore import QPoint + from PySide6.QtGui import QImage, QPainter, QRegion from PySide6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "5": + from PyQt5.QtCore import QPoint + from PyQt5.QtGui import QImage, QPainter, QRegion from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "side2": + from PySide2.QtCore import QPoint + from PySide2.QtGui import QImage, QPainter, QRegion from PySide2.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget class Example(QWidget): @@ -49,7 +57,8 @@ def test_sanity(tmp_path): for mode in ("1", "RGB", "RGBA", "L", "P"): # to QPixmap - data = ImageQt.toqpixmap(hopper(mode)) + im = hopper(mode) + data = ImageQt.toqpixmap(im) assert isinstance(data, QPixmap) assert not data.isNull() @@ -58,6 +67,20 @@ def test_sanity(tmp_path): tempfile = str(tmp_path / f"temp_{mode}.png") data.save(tempfile) + # Render the image + qimage = ImageQt.ImageQt(im) + data = QPixmap.fromImage(qimage) + qt_format = QImage.Format if ImageQt.qt_version == "6" else QImage + qimage = QImage(128, 128, qt_format.Format_ARGB32) + painter = QPainter(qimage) + image_label = QLabel() + image_label.setPixmap(data) + image_label.render(painter, QPoint(0, 0), QRegion(0, 0, 128, 128)) + painter.end() + rendered_tempfile = str(tmp_path / f"temp_rendered_{mode}.png") + qimage.save(rendered_tempfile) + assert_image_equal_tofile(im.convert("RGBA"), rendered_tempfile) + # from QPixmap roundtrip(hopper(mode)) diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 56650e102..32630f2ca 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -153,7 +153,10 @@ def _toqclass_helper(im): for i in range(0, len(palette), 3): colortable.append(rgb(*palette[i : i + 3])) elif im.mode == "RGB": - data = im.tobytes("raw", "BGRX") + # Populate the 4th channel with 255 + im = im.convert("RGBA") + + data = im.tobytes("raw", "BGRA") format = qt_format.Format_RGB32 elif im.mode == "RGBA": data = im.tobytes("raw", "BGRA") @@ -206,9 +209,5 @@ def toqpixmap(im): # im_data = _toqclass_helper(im) # result = QPixmap(im_data["size"][0], im_data["size"][1]) # result.loadFromData(im_data["data"]) - # Fix some strange bug that causes - if im.mode == "RGB": - im = im.convert("RGBA") - qimage = toqimage(im) return QPixmap.fromImage(qimage) From f42d6cf1ac493ed7007af4c1c86810fcf1557e4b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 10 Mar 2021 20:16:49 +1100 Subject: [PATCH 72/79] Save ICC profile from TIFF encoderinfo --- Tests/test_file_png.py | 2 ++ Tests/test_file_tiff.py | 22 ++++++++++++++++++++++ src/PIL/TiffImagePlugin.py | 5 +++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 57bc7f015..52ea3b6d2 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -517,6 +517,8 @@ class TestFilePng: def test_discard_icc_profile(self): with Image.open("Tests/images/icc_profile.png") as im: + assert "icc_profile" in im.info + im = roundtrip(im, icc_profile=None) assert "icc_profile" not in im.info diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index f09117ca7..ba7f9a084 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -568,6 +568,28 @@ class TestFileTiff: with Image.open(tmpfile) as reloaded: assert b"Dummy value" == reloaded.info["icc_profile"] + def test_save_icc_profile(self, tmp_path): + im = hopper() + assert "icc_profile" not in im.info + + outfile = str(tmp_path / "temp.tif") + icc_profile = b"Dummy value" + im.save(outfile, icc_profile=icc_profile) + + with Image.open(outfile) as reloaded: + assert reloaded.info["icc_profile"] == icc_profile + + def test_discard_icc_profile(self, tmp_path): + outfile = str(tmp_path / "temp.tif") + + with Image.open("Tests/images/icc_profile.png") as im: + assert "icc_profile" in im.info + + im.save(outfile, icc_profile=None) + + with Image.open(outfile) as reloaded: + assert "icc_profile" not in reloaded.info + def test_close_on_load_exclusive(self, tmp_path): # similar to test_fd_leak, but runs on unixlike os tmpfile = str(tmp_path / "temp.tif") diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 0b70ce382..98c70d7c4 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1481,8 +1481,9 @@ def _save(im, fp, filename): # preserve ICC profile (should also work when saving other formats # which support profiles as TIFF) -- 2008-06-06 Florian Hoech - if "icc_profile" in im.info: - ifd[ICCPROFILE] = im.info["icc_profile"] + icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + ifd[ICCPROFILE] = icc for key, name in [ (IMAGEDESCRIPTION, "description"), From 68b655f3f014c6beb13f4c9a6fa53f1ebff527c2 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 10 Mar 2021 20:43:16 +1100 Subject: [PATCH 73/79] Updated format specifiers --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index a67091921..746994da3 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -56,7 +56,7 @@ _tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) { dump_state(state); if (state->loc > state->eof) { - TIFFError("_tiffReadProc", "Invalid Read at loc %lu, eof: %lu", state->loc, state->eof); + TIFFError("_tiffReadProc", "Invalid Read at loc %llu, eof: %llu", state->loc, state->eof); return 0; } to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc); From 2844fd2d18e2711db7facd9bd61f6aaa0ee7cef0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 12 Mar 2021 22:45:07 +1100 Subject: [PATCH 74/79] Fixed unclosed file warning --- Tests/test_file_icns.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 7ce8cb286..30ec3dc72 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -143,8 +143,8 @@ def test_not_an_icns_file(): def test_icns_decompression_bomb(): - with pytest.raises(Image.DecompressionBombError): - im = Image.open( - "Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns" - ) - im.load() + with Image.open( + "Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns" + ) as im: + with pytest.raises(Image.DecompressionBombError): + im.load() From cfcedcc5203acb26f79d1b59a38521eee605b4f3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 14 Mar 2021 21:21:40 +1100 Subject: [PATCH 75/79] icc_profile is now a keyword argument when saving TIFF files [ci skip] --- docs/handbook/image-file-formats.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 35c4177aa..0ccd3b1a4 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -901,6 +901,9 @@ using the general tags available through tiffinfo. **copyright** Strings +**icc_profile** + The ICC Profile to include in the saved file. + **resolution_unit** An integer. 1 for no unit, 2 for inches and 3 for centimeters. From d466620cfa31e5caf5b6fdd1aade93b5df144ee1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 14 Mar 2021 21:25:16 +1100 Subject: [PATCH 76/79] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 57e7f75cc..dbe06304d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Save ICC profile from TIFF encoderinfo #5321 + [radarhere] + +- Moved RGB fix inside ImageQt class #5268 + [radarhere] + - Allow alpha_composite destination to be negative #5313 [radarhere] From d0d42cd7c25bbdd27b5a64b69d5340b006852bb0 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 11 Mar 2021 22:32:30 +0100 Subject: [PATCH 77/79] Install pytest-timeout on the ci. (dry?) --- .ci/install.sh | 1 + .github/workflows/macos-install.sh | 1 + .github/workflows/test-windows.yml | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index 9372d0c51..4917b3a7c 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -27,6 +27,7 @@ python3 -m pip install coverage python3 -m pip install olefile python3 -m pip install -U pytest python3 -m pip install -U pytest-cov +python3 -m pip install -U pytest-timeout python3 -m pip install pyroma python3 -m pip install test-image-results # TODO Remove condition when numpy supports 3.10 diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index afcb9a5a7..f45824445 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -9,6 +9,7 @@ python3 -m pip install coverage python3 -m pip install olefile python3 -m pip install -U pytest python3 -m pip install -U pytest-cov +python3 -m pip install -U pytest-timeout python3 -m pip install pyroma python3 -m pip install test-image-results diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index f3bb85f32..8cab06efb 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -57,8 +57,8 @@ jobs: - name: Print build system information run: python .github/workflows/system-info.py - - name: python -m pip install wheel pytest pytest-cov - run: python -m pip install wheel pytest pytest-cov + - name: python -m pip install wheel pytest pytest-cov pytest-timeout + run: python -m pip install wheel pytest pytest-cov pytest-timeout # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: - name: Upgrade setuptools From 12715c5ea9097af314d3ffec688800c91b9c9f23 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 14:22:27 +0100 Subject: [PATCH 78/79] Install Pytest-timeout in dev-requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 1ed1356f9..4b534ae53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ packaging pyroma pytest pytest-cov +pytest-timeout sphinx>=2.4 sphinx-issues sphinx-removed-in From b57aee53a2ecbbc56d3da212aa08ab9184e8a7f1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 15 Mar 2021 08:30:27 +1100 Subject: [PATCH 79/79] Added release notes for #5321 [ci skip] --- docs/releasenotes/8.2.0.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index bbac2449f..95b17ab31 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -51,6 +51,14 @@ instances, so it will only be used by ``im.show()`` or :py:func:`.ImageShow.show if none of the other viewers are available. This means that the behaviour of :py:class:`PIL.ImageShow` will stay the same for most Pillow users. +Saving TIFF with ICC profile +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As is already possible for JPEG, PNG and WebP, the ICC profile for TIFF files can now +be specified through a keyword argument:: + + im.save("out.tif", icc_profile=...) + Security ========