|
57 | 57 | #include <stdlib.h> |
58 | 58 | #include <string.h> |
59 | 59 | #include <math.h> |
| 60 | +#include <limits.h> |
60 | 61 |
|
61 | 62 | #include "gd.h" |
62 | 63 | #include "gdhelpers.h" |
@@ -1873,7 +1874,10 @@ int gdTransformAffineGetImage(gdImagePtr *dst, |
1873 | 1874 | src_area = &area_full; |
1874 | 1875 | } |
1875 | 1876 |
|
1876 | | - gdTransformAffineBoundingBox(src_area, affine, &bbox); |
| 1877 | + if (gdTransformAffineBoundingBox(src_area, affine, &bbox) != GD_TRUE) { |
| 1878 | + *dst = NULL; |
| 1879 | + return GD_FALSE; |
| 1880 | + } |
1877 | 1881 |
|
1878 | 1882 | *dst = gdImageCreateTrueColor(bbox.width, bbox.height); |
1879 | 1883 | if (*dst == NULL) { |
@@ -2049,6 +2053,8 @@ int gdTransformAffineCopy(gdImagePtr dst, |
2049 | 2053 | int gdTransformAffineBoundingBox(gdRectPtr src, const double affine[6], gdRectPtr bbox) |
2050 | 2054 | { |
2051 | 2055 | gdPointF extent[4], min, max, point; |
| 2056 | + double width, height; |
| 2057 | + int bbox_x, bbox_y, bbox_width, bbox_height; |
2052 | 2058 | int i; |
2053 | 2059 |
|
2054 | 2060 | extent[0].x=0.0; |
@@ -2079,10 +2085,29 @@ int gdTransformAffineBoundingBox(gdRectPtr src, const double affine[6], gdRectPt |
2079 | 2085 | if (max.y < extent[i].y) |
2080 | 2086 | max.y=extent[i].y; |
2081 | 2087 | } |
2082 | | - bbox->x = (int) min.x; |
2083 | | - bbox->y = (int) min.y; |
2084 | | - bbox->width = (int) floor(max.x - min.x) - 1; |
2085 | | - bbox->height = (int) floor(max.y - min.y); |
| 2088 | + width = floor(max.x - min.x); |
| 2089 | + height = floor(max.y - min.y); |
| 2090 | + if (!isfinite(min.x) || !isfinite(min.y) || !isfinite(width) || !isfinite(height) |
| 2091 | + || min.x <= INT_MIN || min.x > INT_MAX |
| 2092 | + || min.y <= INT_MIN || min.y > INT_MAX |
| 2093 | + || width < 1.0 || width > INT_MAX |
| 2094 | + || height < 0.0 || height > INT_MAX) { |
| 2095 | + return GD_FALSE; |
| 2096 | + } |
| 2097 | + bbox_x = (int) min.x; |
| 2098 | + bbox_y = (int) min.y; |
| 2099 | + bbox_width = (int) width - 1; |
| 2100 | + bbox_height = (int) height; |
| 2101 | + if ((bbox_x < 0 && bbox_width > INT_MAX + bbox_x) |
| 2102 | + || (bbox_x > 0 && bbox_width > INT_MAX - bbox_x) |
| 2103 | + || (bbox_y < 0 && bbox_height > INT_MAX + bbox_y) |
| 2104 | + || (bbox_y > 0 && bbox_height > INT_MAX - bbox_y)) { |
| 2105 | + return GD_FALSE; |
| 2106 | + } |
| 2107 | + bbox->x = bbox_x; |
| 2108 | + bbox->y = bbox_y; |
| 2109 | + bbox->width = bbox_width; |
| 2110 | + bbox->height = bbox_height; |
2086 | 2111 | return GD_TRUE; |
2087 | 2112 | } |
2088 | 2113 |
|
|
0 commit comments