Skip to content

Commit 35affa0

Browse files
committed
Fix GH-19666: imageconvolution() unexpected nan filter value
undefined behavior occurs during cast from float to int when the element of the filter matrix is -INF.
1 parent d74901a commit 35affa0

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

ext/gd/libgd/gd_filter.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
#include "gd.h"
22

33
#include "gd_intern.h"
4+
#include "gd_errors.h"
45

56
#ifdef _WIN32
67
# include <windows.h>
78
#else
89
# include <unistd.h>
910
#endif
1011
#include <stdlib.h>
12+
#include <math.h>
1113
#include <time.h>
1214

1315
/* Filters function added on 2003/12
@@ -383,6 +385,24 @@ int gdImageConvolution(gdImagePtr src, float filter[3][3], float filter_div, flo
383385
new_g = (new_g > 255.0f)? 255.0f : ((new_g < 0.0f)? 0.0f:new_g);
384386
new_b = (new_b > 255.0f)? 255.0f : ((new_b < 0.0f)? 0.0f:new_b);
385387

388+
if (isnan(new_r)) {
389+
gd_error("Matrix: invalid top-left filter");
390+
gdImageDestroy(srcback);
391+
return 0;
392+
}
393+
394+
if (isnan(new_g)) {
395+
gd_error("Matrix: invalid center filter");
396+
gdImageDestroy(srcback);
397+
return 0;
398+
}
399+
400+
if (isnan(new_b)) {
401+
gd_error("Matrix: invalid bottom-right filter");
402+
gdImageDestroy(srcback);
403+
return 0;
404+
}
405+
386406
new_pxl = gdImageColorAllocateAlpha(src, (int)new_r, (int)new_g, (int)new_b, new_a);
387407
if (new_pxl == -1) {
388408
new_pxl = gdImageColorClosestAlpha(src, (int)new_r, (int)new_g, (int)new_b, new_a);

0 commit comments

Comments
 (0)