Skip to content

Commit 4c16abf

Browse files
authored
Merge pull request #123 from m-carrasco/fix-gradient-ub
Fix undefined behavior caused by a domain error on an sqrt call.
2 parents 585d61e + 4d51541 commit 4c16abf

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

3rdparty/plutovg/plutovg-blend.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <limits.h>
44
#include <math.h>
5+
#include <float.h>
56

67
#define COLOR_TABLE_SIZE 1024
78
typedef struct {
@@ -243,6 +244,7 @@ static void fetch_radial_gradient(uint32_t* buffer, const radial_gradient_values
243244
while(buffer < end)
244245
{
245246
uint32_t result = 0;
247+
det = fabs(det) < DBL_EPSILON ? 0.0 : det;
246248
if(det >= 0)
247249
{
248250
double w = sqrt(det) - b;
@@ -261,7 +263,11 @@ static void fetch_radial_gradient(uint32_t* buffer, const radial_gradient_values
261263
{
262264
while(buffer < end)
263265
{
264-
*buffer++ = gradient_pixel(gradient, sqrt(det) - b);
266+
det = fabs(det) < DBL_EPSILON ? 0.0 : det;
267+
uint32_t result = 0;
268+
if (det >= 0)
269+
result = gradient_pixel(gradient, sqrt(det) - b);
270+
*buffer++ = result;
265271
det += delta_det;
266272
delta_det += delta_delta_det;
267273
b += delta_b;

0 commit comments

Comments
 (0)