This commit is contained in:
Andrew Murray 2026-02-03 21:42:10 +11:00 committed by GitHub
commit 163452e216
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 26 additions and 4 deletions

View File

@ -540,3 +540,18 @@ def test_save_large_file(tmp_path: Path, pixel_format: str, mode: str) -> None:
im = hopper(mode).resize((440, 440))
# should not error in valgrind
im.save(tmp_path / "img.dds", pixel_format=pixel_format)
@pytest.mark.parametrize(
"test_file",
[
"Tests/images/timeout-041dd17dfde800360a47a172269df127af138c6b.dds",
"Tests/images/timeout-755a4d204f4208e3597ac3391edebee196462bd0.dds",
"Tests/images/timeout-52d106579505547091ef69b58341351a37c23e31.dds",
"Tests/images/timeout-c60a3d7314213624607bfb3e38d551a8b24a7435.dds",
],
)
def test_not_enough_image_data(test_file: str) -> None:
with Image.open(test_file) as im:
with pytest.raises(ValueError, match="not enough image data"):
im.load()

View File

@ -489,9 +489,14 @@ class DdsRgbDecoder(ImageFile.PyDecoder):
_pulls_fd = True
def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
assert self.fd is not None
bitcount, masks = self.args
data = bytearray()
bytecount = bitcount // 8
if not bytecount:
self.set_as_raw(data)
return -1, 0
# Some masks will be padded with zeros, e.g. R 0b11 G 0b1100
# Calculate how many zeros each mask is padded with
mask_offsets = []
@ -505,11 +510,13 @@ class DdsRgbDecoder(ImageFile.PyDecoder):
mask_offsets.append(offset)
mask_totals.append(mask >> offset)
data = bytearray()
bytecount = bitcount // 8
assert self.fd is not None
dest_length = self.state.xsize * self.state.ysize * len(masks)
while len(data) < dest_length:
value = int.from_bytes(self.fd.read(bytecount), "little")
bytes_read = self.fd.read(bytecount)
if len(bytes_read) < bytecount:
break
value = int.from_bytes(bytes_read, "little")
for i, mask in enumerate(masks):
masked_value = value & mask
# Remove the zero padding, and scale it to 8 bits