diff --git a/Tests/test_image_filter.py b/Tests/test_image_filter.py index 4fa24e2f9c5..2ab3fa61bfb 100644 --- a/Tests/test_image_filter.py +++ b/Tests/test_image_filter.py @@ -235,6 +235,20 @@ def test_invalid_box_blur_filter(radius: int | tuple[int, int]) -> None: im.filter(box_blur_filter) +@pytest.mark.parametrize( + "radius", + ( + float("nan"), + float("inf"), + (float("nan"), 2), + (2, float("inf")), + ), +) +def test_box_blur_non_finite_radius(radius: float | tuple[float, float]) -> None: + with pytest.raises(ValueError): + ImageFilter.BoxBlur(radius) + + def test_rankfilter_size_1() -> None: im = Image.new("L", (3, 3), 128) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index b5229cad92b..42ce646cc6d 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -17,6 +17,7 @@ from __future__ import annotations import abc +import math from typing import cast TYPE_CHECKING = False @@ -222,8 +223,8 @@ class BoxBlur(MultibandFilter): def __init__(self, radius: float | Sequence[float]) -> None: xy = radius if isinstance(radius, (tuple, list)) else (radius, radius) - if xy[0] < 0 or xy[1] < 0: - msg = "radius must be >= 0" + if not all(math.isfinite(value) and value >= 0 for value in xy): + msg = "radius must be a finite number >= 0" raise ValueError(msg) self.radius = radius