From 11f1ba35408288332cc29202bd1c8bf65399a608 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 2 Mar 2022 11:55:18 +1100 Subject: [PATCH] Skip additional data if past end of row --- Tests/images/hopper_rle8_row_overflow.bmp | Bin 0 -> 27086 bytes Tests/test_file_bmp.py | 5 +++++ src/PIL/BmpImagePlugin.py | 8 ++++++++ 3 files changed, 13 insertions(+) create mode 100644 Tests/images/hopper_rle8_row_overflow.bmp diff --git a/Tests/images/hopper_rle8_row_overflow.bmp b/Tests/images/hopper_rle8_row_overflow.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d606dc3e41accb4a1847f74829761c0fcb81fa21 GIT binary patch literal 27086 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

t5T?h4L<4BIHile0jievrCd%D!Vc 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 E|4{47!vFvP literal 0 HcmV?d00001 diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index e0c70f037..15b4b3670 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -134,6 +134,11 @@ def test_rle8(): with Image.open("Tests/images/hopper_rle8.bmp") as im: assert_image_similar_tofile(im.convert("RGB"), "Tests/images/hopper.bmp", 12) + # This test image has been manually hexedited + # to have rows with too much data + with Image.open("Tests/images/hopper_rle8_row_overflow.bmp") as im: + assert_image_similar_tofile(im.convert("RGB"), "Tests/images/hopper.bmp", 12) + def test_offset(): # This image has been hexedited diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 650478db9..60617dce3 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -281,17 +281,23 @@ class BmpRleDecoder(ImageFile.PyDecoder): def decode(self, buffer): data = bytearray() + x = 0 while True: num_pixels = self.fd.read(1)[0] byte = self.fd.read(1) if num_pixels: # encoded mode + if x + num_pixels > self.state.xsize: + # Too much data for row + num_pixels = max(0, self.state.xsize - x) data += byte * num_pixels + x += num_pixels else: if byte[0] == 0: # end of line while len(data) % self.state.xsize != 0: data += b"\x00" + x = 0 elif byte[0] == 1: # end of bitmap break @@ -299,9 +305,11 @@ class BmpRleDecoder(ImageFile.PyDecoder): # delta right, up = self.fd.read(2) data += b"\x00" * (right + up * self.state.xsize) + x = len(data) % self.state.xsize else: # absolute mode data += self.fd.read(byte[0]) + x += byte[0] # align to 16-bit word boundary if self.fd.tell() % 2 != 0: