Skip to content

Commit cce3bdb

Browse files
authored
Validate large filter sizes when initializing RankFilter (#9695)
2 parents f39b0ae + dff01a0 commit cce3bdb

3 files changed

Lines changed: 12 additions & 0 deletions

File tree

‎Tests/test_image_filter.py‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,12 @@ def test_rankfilter_properties() -> None:
150150
with pytest.raises(ValueError, match="bad filter size"):
151151
ImageFilter.MinFilter(2)
152152

153+
with pytest.raises(ValueError, match="filter size too large"):
154+
ImageFilter.RankFilter(23171, 1)
155+
im = Image.new("1", (1, 1))
156+
with pytest.raises(ValueError, match="filter size too large"):
157+
im.im.expand(23171)
158+
153159
with pytest.raises(ValueError, match="bad rank value"):
154160
ImageFilter.RankFilter(1, 1)
155161

‎src/PIL/ImageFilter.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ def __init__(self, size: int, rank: int) -> None:
102102
if size % 2 == 0:
103103
msg = "bad filter size"
104104
raise ValueError(msg)
105+
if size * size * 4 > (2**31 - 1):
106+
msg = "filter size too large"
107+
raise ValueError(msg)
105108
if rank < 0 or rank >= size * size:
106109
msg = "bad rank value"
107110
raise ValueError(msg)

‎src/libImaging/Filter.c‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ ImagingExpand(Imaging imIn, int margin) {
5959
if (margin < 0) {
6060
return (Imaging)ImagingError_ValueError("bad kernel size");
6161
}
62+
if (margin > INT_MAX / (margin * (int)sizeof(FLOAT32))) {
63+
return (Imaging)ImagingError_ValueError("filter size too large");
64+
}
6265

6366
imOut =
6467
ImagingNewDirty(imIn->mode, imIn->xsize + 2 * margin, imIn->ysize + 2 * margin);

0 commit comments

Comments
 (0)