From 45530d5ce1bcc9357907b7e5eeb6e54c6198358e Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 31 Mar 2021 21:04:59 +0200 Subject: [PATCH 1/3] fixes crash-74d2 --- ...d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif | Bin 0 -> 1026 bytes Tests/test_tiff_crashes.py | 2 ++ src/libImaging/TiffDecode.c | 28 ++++++++++-------- 3 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif diff --git a/Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif b/Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif new file mode 100644 index 0000000000000000000000000000000000000000..053e4e4e952ca9a0139f6d7a2b726c64b305fdc1 GIT binary patch literal 1026 zcmebD)M8L#W?-26NO_Ufk^28Y@PtFO{{OiTAm;z4e1ftr?jVtWr;6q**8~y^Pc%Fctuf9vD_|E>4lw{G>W*cD#KZ)Jz_a~+ZtcPSMFTBzV~tz!TG{~zT~ zY-iQb2xz?QzubGlL>U_`{-v*dU;p~I|NpOl(`#eHOLhlL?cZ{3m7HjcK`I}Y^8f#z zGzuI}UbV0)_%^qu?{ysize; } @@ -281,17 +281,6 @@ _decodeAsRGBA(Imaging im, ImagingCodecState state, TIFF *tiff) { img.req_orientation = ORIENTATION_TOPLEFT; img.col_offset = 0; - if (state->xsize != img.width || state->ysize != img.height) { - TRACE( - ("Inconsistent Image Error: %d =? %d, %d =? %d", - state->xsize, - img.width, - state->ysize, - img.height)); - state->errcode = IMAGING_CODEC_BROKEN; - goto decodergba_err; - } - /* overflow check for row byte size */ if (INT_MAX / 4 < img.width) { state->errcode = IMAGING_CODEC_MEMORY; @@ -559,6 +548,7 @@ ImagingLibTiffDecode( uint16 planarconfig = 0; int planes = 1; ImagingShuffler unpackers[4]; + UINT32 img_width, img_height; memset(unpackers, 0, sizeof(ImagingShuffler) * 4); @@ -655,6 +645,20 @@ ImagingLibTiffDecode( } } + TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &img_width); + TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &img_height); + + if (state->xsize != img_width || state->ysize != img_height) { + TRACE( + ("Inconsistent Image Error: %d =? %d, %d =? %d", + state->xsize, + img_width, + state->ysize, + img_height)); + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } + TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); TIFFGetField(tiff, TIFFTAG_COMPRESSION, &compression); From 53c80281d7f745cc1804901ec6f5b61d236688e0 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 31 Mar 2021 21:16:43 +0200 Subject: [PATCH 2/3] fix for crash-8115 --- ...81154a65438ba5aaeca73fd502fa4850fbde60f8.tif | Bin 0 -> 42224 bytes Tests/test_tiff_crashes.py | 1 + src/PIL/TiffImagePlugin.py | 4 ++++ 3 files changed, 5 insertions(+) create mode 100644 Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif diff --git a/Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif b/Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif new file mode 100644 index 0000000000000000000000000000000000000000..56e824199684ab6a2fccf04f6c1002e7cbda63ff GIT binary patch literal 42224 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 literal 0 HcmV?d00001 diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index 7b01d458eb1..a8e378ec126 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -34,6 +34,7 @@ "Tests/images/crash-f46f5b2f43c370fe65706c11449f567ecc345e74.tif", "Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif", "Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif", + "Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif", ], ) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 24821d1304b..9d821dcf965 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1250,6 +1250,10 @@ def _setup(self): if bps_count > len(bps_tuple) and len(bps_tuple) == 1: bps_tuple = bps_tuple * bps_count + samplesPerPixel = self.tag_v2.get(SAMPLESPERPIXEL, 1) + if len(bps_tuple) != samplesPerPixel: + raise SyntaxError("unknown data organization") + # mode: check photometric interpretation and bits per pixel key = ( self.tag_v2.prefix, From 87934e22d056cb72ad6c7e9dc48e06d2a02e2dec Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 31 Mar 2021 23:17:20 +0200 Subject: [PATCH 3/3] Fix for crash-0da0 --- ...h-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif | Bin 0 -> 674 bytes Tests/test_tiff_crashes.py | 2 +- src/libImaging/TiffDecode.c | 9 ++++++--- 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif diff --git a/Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif b/Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif new file mode 100644 index 0000000000000000000000000000000000000000..6e4e9b9caa53af34c5ee072974084618d9ffedc4 GIT binary patch literal 674 zcmebD)MB{6z`*eT|NnF?AJ#(FhuWH*0!*z3oY)%`H#mJzl=$>1l|#&9$!777mM_~_ z4yv_qH+g^Cy(PzS-owDkI_&ON8&CV46TU+R7PsdszGI(^TjfAc)1uiC#v>#x2C_pkhy z6aGc*dU6{mo*i4Y;_G_v+Siv;er5IVkdd-05NJH6n zK(-8$UOA|^8&F&x%Ju`YHK1yMOa@IL8$<(r$Y2O`n+1>+1{5#?vPFRGK8PfPenx(7 zs(xxwW^%E9KxR%(ez|@~YH>-ier9fBdTOzLx`}QYNVq5^wMe%FD5F=Bna1FqpO#pm z5a8mb;Fg(Fl3Jvot5B9&RGgWgr(mpSZmI{ew?UPGK>OV literal 0 HcmV?d00001 diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index a8e378ec126..6cdb8e44da2 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -35,7 +35,7 @@ "Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif", "Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif", "Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif", - + "Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif", ], ) @pytest.mark.filterwarnings("ignore:Possibly corrupt EXIF data") diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 25616da24b1..bae3afff4c1 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -451,7 +451,7 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imagin UINT8 *new_data; UINT32 rows_per_strip; int ret; - tsize_t strip_size, row_byte_size; + tsize_t strip_size, row_byte_size, unpacker_row_byte_size; ret = TIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip); if (ret != 1 || rows_per_strip==(UINT32)(-1)) { @@ -471,7 +471,8 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imagin return -1; } - if (strip_size > ((state->xsize * state->bits / planes + 7) / 8) * rows_per_strip) { + unpacker_row_byte_size = (state->xsize * state->bits / planes + 7) / 8; + if (strip_size > (unpacker_row_byte_size * rows_per_strip)) { // If the strip size as expected by LibTiff isn't what we're expecting, abort. // man: TIFFStripSize returns the equivalent size for a strip of data as it would be returned in a // call to TIFFReadEncodedStrip ... @@ -485,7 +486,9 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imagin row_byte_size = TIFFScanlineSize(tiff); - if (row_byte_size == 0 || row_byte_size > strip_size) { + // if the unpacker calculated row size is > row byte size, (at least) the last + // row of the strip will have a read buffer overflow. + if (row_byte_size == 0 || unpacker_row_byte_size > row_byte_size) { state->errcode = IMAGING_CODEC_BROKEN; return -1; }