From e1f4352ce9b3b92912f7a678666c9f5bca09101e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 21 Oct 2025 23:11:18 +1100 Subject: [PATCH] Fixed ZeroDivisionError --- Tests/images/zero_mask_totals.dds | Bin 0 -> 131 bytes Tests/test_file_dds.py | 5 +++++ src/PIL/DdsImagePlugin.py | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 Tests/images/zero_mask_totals.dds diff --git a/Tests/images/zero_mask_totals.dds b/Tests/images/zero_mask_totals.dds new file mode 100644 index 0000000000000000000000000000000000000000..31e329e4f266b8c8407531b77e65fbd9c46b41a4 GIT binary patch literal 131 pcmZ>930A0KU|`@EU|?Vb(jd$X#N+@4pe6^XMhPg5LILf-0s!Yi0we$c literal 0 HcmV?d00001 diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 116dfa59c..60d0c09bc 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -380,6 +380,11 @@ def test_palette() -> None: assert_image_equal_tofile(im, "Tests/images/transparent.gif") +def test_zero_mask_totals() -> None: + with Image.open("Tests/images/zero_mask_totals.dds") as im: + im.load() + + def test_unsupported_header_size() -> None: with pytest.raises(OSError, match="Unsupported header size 0"): with Image.open(BytesIO(b"DDS " + b"\x00" * 4)): diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index f9ade18f9..37e16d527 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -333,6 +333,7 @@ class DdsImageFile(ImageFile.ImageFile): format_description = "DirectDraw Surface" def _open(self) -> None: + assert self.fp is not None if not _accept(self.fp.read(4)): msg = "not a DDS file" raise SyntaxError(msg) @@ -516,6 +517,8 @@ class DdsRgbDecoder(ImageFile.PyDecoder): # Remove the zero padding, and scale it to 8 bits data += o8( int(((masked_value >> mask_offsets[i]) / mask_totals[i]) * 255) + if mask_totals[i] + else 0 ) self.set_as_raw(data) return -1, 0