File ImageMagick-CVE-2020-25676.patch of Package ImageMagick.30356
Index: ImageMagick-7.0.7-34/MagickCore/pixel.c
===================================================================
--- ImageMagick-7.0.7-34.orig/MagickCore/pixel.c 2018-05-20 17:55:43.000000000 +0200
+++ ImageMagick-7.0.7-34/MagickCore/pixel.c 2020-12-04 10:56:42.444581323 +0100
@@ -4448,6 +4448,15 @@ static inline void CatromWeights(const d
(*weights)[2]=x-(*weights)[3]-gamma;
}
+static inline double ConstrainPixelOffset(double x)
+{
+ if (x < (double) -(SSIZE_MAX-512))
+ return((double) -(SSIZE_MAX-512));
+ if (x > (double) (SSIZE_MAX-512))
+ return((double) (SSIZE_MAX-512));
+ return(x);
+}
+
static inline void SplineWeights(const double x,double (*weights)[4])
{
double
@@ -4474,15 +4483,6 @@ static inline double MeshInterpolate(con
return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
}
-/*
-static inline ssize_t NearestNeighbor(const double x)
-{
- if (x >= 0.0)
- return((ssize_t) (x+0.5));
- return((ssize_t) (x-0.5));
-}
-*/
-
MagickExport MagickBooleanType InterpolatePixelChannel(const Image *image,
const CacheView_ *image_view,const PixelChannel channel,
const PixelInterpolateMethod method,const double x,const double y,
@@ -4518,8 +4518,8 @@ MagickExport MagickBooleanType Interpola
status=MagickTrue;
*pixel=0.0;
traits=GetPixelChannelTraits(image,channel);
- x_offset=(ssize_t) floor(x);
- y_offset=(ssize_t) floor(y);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x));
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y));
interpolate=method;
if (interpolate == UndefinedInterpolatePixel)
interpolate=image->interpolate;
@@ -4536,8 +4536,8 @@ MagickExport MagickBooleanType Interpola
if (interpolate == Average9InterpolatePixel)
{
count=3;
- x_offset=(ssize_t) (floor(x+0.5)-1);
- y_offset=(ssize_t) (floor(y+0.5)-1);
+ x_offset=(ssize_t) (floor(ConstrainPixelOffset(x)+0.5)-1);
+ y_offset=(ssize_t) (floor(ConstrainPixelOffset(y)+0.5)-1);
}
else
if (interpolate == Average16InterpolatePixel)
@@ -4720,8 +4720,8 @@ MagickExport MagickBooleanType Interpola
}
case NearestInterpolatePixel:
{
- x_offset=(ssize_t) floor(x+0.5);
- y_offset=(ssize_t) floor(y+0.5);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x)+0.5);
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y)+0.5);
p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
if (p == (const Quantum *) NULL)
{
@@ -4937,8 +4937,8 @@ MagickExport MagickBooleanType Interpola
assert(source->signature == MagickCoreSignature);
assert(source_view != (CacheView *) NULL);
status=MagickTrue;
- x_offset=(ssize_t) floor(x);
- y_offset=(ssize_t) floor(y);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x));
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y));
interpolate=method;
if (interpolate == UndefinedInterpolatePixel)
interpolate=source->interpolate;
@@ -4955,8 +4955,8 @@ MagickExport MagickBooleanType Interpola
if (interpolate == Average9InterpolatePixel)
{
count=3;
- x_offset=(ssize_t) (floor(x+0.5)-1);
- y_offset=(ssize_t) (floor(y+0.5)-1);
+ x_offset=(ssize_t) (floor(ConstrainPixelOffset(x)+0.5)-1);
+ y_offset=(ssize_t) (floor(ConstrainPixelOffset(y)+0.5)-1);
}
else
if (interpolate == Average16InterpolatePixel)
@@ -5220,8 +5220,8 @@ MagickExport MagickBooleanType Interpola
}
case NearestInterpolatePixel:
{
- x_offset=(ssize_t) floor(x+0.5);
- y_offset=(ssize_t) floor(y+0.5);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x)+0.5);
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y)+0.5);
p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
if (p == (const Quantum *) NULL)
{
@@ -5504,8 +5504,8 @@ MagickExport MagickBooleanType Interpola
assert(image->signature == MagickCoreSignature);
assert(image_view != (CacheView *) NULL);
status=MagickTrue;
- x_offset=(ssize_t) floor(x);
- y_offset=(ssize_t) floor(y);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x));
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y));
interpolate=method;
if (interpolate == UndefinedInterpolatePixel)
interpolate=image->interpolate;
@@ -5524,8 +5524,8 @@ MagickExport MagickBooleanType Interpola
if (interpolate == Average9InterpolatePixel)
{
count=3;
- x_offset=(ssize_t) (floor(x+0.5)-1);
- y_offset=(ssize_t) (floor(y+0.5)-1);
+ x_offset=(ssize_t) (floor(ConstrainPixelOffset(x)+0.5)-1);
+ y_offset=(ssize_t) (floor(ConstrainPixelOffset(y)+0.5)-1);
}
else if (interpolate == Average16InterpolatePixel)
{
@@ -5849,8 +5849,8 @@ MagickExport MagickBooleanType Interpola
}
case NearestInterpolatePixel:
{
- x_offset=(ssize_t) floor(x+0.5);
- y_offset=(ssize_t) floor(y+0.5);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x)+0.5);
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y)+0.5);
p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
if (p == (const Quantum *) NULL)
{