File ImageMagick-CVE-2020-27767,27768,27751,27752,27757.patch of Package ImageMagick.19143
Index: ImageMagick-6.8.8-1/magick/quantum.h
===================================================================
--- ImageMagick-6.8.8-1.orig/magick/quantum.h 2013-11-27 20:02:59.000000000 +0100
+++ ImageMagick-6.8.8-1/magick/quantum.h 2021-02-15 13:27:57.153365505 +0100
@@ -18,6 +18,7 @@
#ifndef _MAGICKCORE_QUANTUM_H
#define _MAGICKCORE_QUANTUM_H
+#include <float.h>
#include "magick/image.h"
#include "magick/semaphore.h"
@@ -26,6 +27,7 @@ extern "C" {
#endif
#define RoundToQuantum(quantum) ClampToQuantum(quantum)
+#define IsNaN(a) ((a) != (a) ? MagickTrue : MagickFalse)
typedef enum
{
@@ -84,16 +86,16 @@ typedef enum
typedef struct _QuantumInfo
QuantumInfo;
-static inline Quantum ClampToQuantum(const MagickRealType value)
+static inline Quantum ClampToQuantum(const MagickRealType quantum)
{
#if defined(MAGICKCORE_HDRI_SUPPORT)
- return((Quantum) value);
+ return((Quantum) quantum);
#else
- if (value <= 0.0f)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return((Quantum) 0);
- if (value >= (MagickRealType) QuantumRange)
+ if (quantum >= (MagickRealType) QuantumRange)
return(QuantumRange);
- return((Quantum) (value+0.5f));
+ return((Quantum) (quantum+0.5));
#endif
}
@@ -103,7 +105,7 @@ static inline unsigned char ScaleQuantum
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned char) quantum);
#else
- if (quantum <= 0.0)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return(0);
if (quantum >= 255.0)
return(255);
@@ -116,7 +118,7 @@ static inline unsigned char ScaleQuantum
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned char) (((quantum+128UL)-((quantum+128UL) >> 8)) >> 8));
#else
- if (quantum <= 0.0)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return(0);
if ((quantum/257.0) >= 255.0)
return(255);
@@ -130,7 +132,7 @@ static inline unsigned char ScaleQuantum
return((unsigned char) ((quantum+MagickULLConstant(8421504))/
MagickULLConstant(16843009)));
#else
- if (quantum <= 0.0)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return(0);
if ((quantum/16843009.0) >= 255.0)
return(255);
@@ -143,7 +145,7 @@ static inline unsigned char ScaleQuantum
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned char) (quantum/72340172838076673.0+0.5));
#else
- if (quantum <= 0.0)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return(0);
if ((quantum/72340172838076673.0) >= 255.0)
return(255);
Index: ImageMagick-6.8.8-1/magick/quantum-import.c
===================================================================
--- ImageMagick-6.8.8-1.orig/magick/quantum-import.c 2021-02-15 13:19:07.446217812 +0100
+++ ImageMagick-6.8.8-1/magick/quantum-import.c 2021-02-15 13:19:10.934238539 +0100
@@ -139,20 +139,18 @@ static inline const unsigned char *PushD
quantum[5]=(*pixels++);
quantum[6]=(*pixels++);
quantum[7]=(*pixels++);
- p=(double *) quantum;
- *pixel=(*p);
- *pixel-=quantum_info->minimum;
- *pixel*=quantum_info->scale;
- return(pixels);
}
- quantum[7]=(*pixels++);
- quantum[6]=(*pixels++);
- quantum[5]=(*pixels++);
- quantum[5]=(*pixels++);
- quantum[3]=(*pixels++);
- quantum[2]=(*pixels++);
- quantum[1]=(*pixels++);
- quantum[0]=(*pixels++);
+ else
+ {
+ quantum[7]=(*pixels++);
+ quantum[6]=(*pixels++);
+ quantum[5]=(*pixels++);
+ quantum[5]=(*pixels++);
+ quantum[3]=(*pixels++);
+ quantum[2]=(*pixels++);
+ quantum[1]=(*pixels++);
+ quantum[0]=(*pixels++);
+ }
p=(double *) quantum;
*pixel=(*p);
*pixel-=quantum_info->minimum;
@@ -176,20 +174,23 @@ static inline const unsigned char *PushF
quantum[1]=(*pixels++);
quantum[2]=(*pixels++);
quantum[3]=(*pixels++);
- p=(float *) quantum;
- *pixel=(*p);
- *pixel-=quantum_info->minimum;
- *pixel*=quantum_info->scale;
- return(pixels);
- }
- quantum[3]=(*pixels++);
- quantum[2]=(*pixels++);
- quantum[1]=(*pixels++);
- quantum[0]=(*pixels++);
+ }
+ else
+ {
+ quantum[3]=(*pixels++);
+ quantum[2]=(*pixels++);
+ quantum[1]=(*pixels++);
+ quantum[0]=(*pixels++);
+ }
p=(float *) quantum;
*pixel=(*p);
*pixel-=quantum_info->minimum;
*pixel*=quantum_info->scale;
+ if (*pixel < FLT_MIN)
+ *pixel=FLT_MIN;
+ else
+ if (*pixel > FLT_MAX)
+ *pixel=FLT_MAX;
return(pixels);
}
Index: ImageMagick-6.8.8-1/magick/quantum-private.h
===================================================================
--- ImageMagick-6.8.8-1.orig/magick/quantum-private.h 2013-11-27 20:02:59.000000000 +0100
+++ ImageMagick-6.8.8-1/magick/quantum-private.h 2021-02-15 13:19:10.934238539 +0100
@@ -19,6 +19,7 @@
#define _MAGICKCORE_QUANTUM_PRIVATE_H
#include "magick/cache.h"
+#include "magick/image-private.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -268,20 +269,42 @@ static inline const unsigned char *PushS
return(pixels);
}
+static inline double PerceptibleReciprocal(const double x)
+{
+ double
+ sign;
+
+ /*
+ Return 1/x where x is perceptible (not unlimited or infinitesimal).
+ */
+ sign=x < 0.0 ? -1.0 : 1.0;
+ if ((sign*x) >= MagickEpsilon)
+ return(1.0/x);
+ return(sign/MagickEpsilon);
+}
+
static inline Quantum ScaleAnyToQuantum(const QuantumAny quantum,
const QuantumAny range)
{
#if !defined(MAGICKCORE_HDRI_SUPPORT)
- return((Quantum) (((MagickRealType) QuantumRange*quantum)/range+0.5));
+ return((Quantum) ((double) QuantumRange*(quantum*PerceptibleReciprocal((double) range))+0.5));
#else
- return((Quantum) (((MagickRealType) QuantumRange*quantum)/range));
+ return((Quantum) ((double) QuantumRange*(quantum*PerceptibleReciprocal((double) range))));
#endif
}
static inline QuantumAny ScaleQuantumToAny(const Quantum quantum,
const QuantumAny range)
{
- return((QuantumAny) (((MagickRealType) range*quantum)/QuantumRange+0.5));
+#if !defined(MAGICKCORE_HDRI_SUPPORT)
+ return((QuantumAny) ((double) range*quantum/QuantumRange));
+#else
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
+ return((QuantumAny) 0UL);
+ if (((double) range*quantum/QuantumRange) >= 18446744073709551615.0)
+ return((QuantumAny) MagickULLConstant(18446744073709551615));
+ return((QuantumAny) ((double) range*quantum/QuantumRange+0.5));
+#endif
}
#if (MAGICKCORE_QUANTUM_DEPTH == 8)
@@ -317,8 +340,8 @@ static inline unsigned int ScaleQuantumT
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned int) (16843009UL*quantum));
#else
- if (quantum <= 0.0)
- return(0UL);
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
+ return(0U);
if ((16843009.0*quantum) >= 4294967295.0)
return(4294967295UL);
return((unsigned int) (16843009.0*quantum+0.5));
@@ -332,8 +355,8 @@ static inline unsigned int ScaleQuantumT
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned int) quantum);
#else
- if (quantum < 0.0)
- return(0UL);
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
+ return(0U);
return((unsigned int) (quantum+0.5));
#endif
}
@@ -343,7 +366,7 @@ static inline unsigned short ScaleQuantu
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned short) (257UL*quantum));
#else
- if (quantum <= 0.0)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return(0);
if ((257.0*quantum) >= 65535.0)
return(65535);
@@ -397,7 +420,7 @@ static inline unsigned int ScaleQuantumT
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned int) (65537UL*quantum));
#else
- if (quantum <= 0.0)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return(0UL);
if ((65537.0*quantum) >= 4294967295.0)
return(4294967295U);
@@ -412,8 +435,8 @@ static inline unsigned int ScaleQuantumT
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned int) quantum);
#else
- if (quantum < 0.0)
- return(0UL);
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
+ return(0U);
return((unsigned int) (quantum+0.5));
#endif
}
@@ -423,7 +446,7 @@ static inline unsigned short ScaleQuantu
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned short) quantum);
#else
- if (quantum <= 0.0)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return(0);
if (quantum >= 65535.0)
return(65535);
@@ -474,14 +497,14 @@ static inline unsigned int ScaleQuantumT
static inline unsigned int ScaleQuantumToMap(const Quantum quantum)
{
- if (quantum < 0.0)
- return(0UL);
if ((quantum/65537) >= (Quantum) MaxMap)
return((unsigned int) MaxMap);
#if !defined(MAGICKCORE_HDRI_SUPPORT)
return((unsigned int) ((quantum+MagickULLConstant(32768))/
MagickULLConstant(65537)));
#else
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
+ return(0U);
return((unsigned int) (quantum/65537.0+0.5));
#endif
}
@@ -492,7 +515,7 @@ static inline unsigned short ScaleQuantu
return((unsigned short) ((quantum+MagickULLConstant(32768))/
MagickULLConstant(65537)));
#else
- if (quantum <= 0.0)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return(0);
if ((quantum/65537.0) >= 65535.0)
return(65535);
@@ -535,8 +558,8 @@ static inline unsigned int ScaleQuantumT
static inline unsigned int ScaleQuantumToMap(const Quantum quantum)
{
- if (quantum <= 0.0)
- return(0UL);
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
+ return(0U);
if ((quantum/281479271743489.0) >= MaxMap)
return((unsigned int) MaxMap);
return((unsigned int) (quantum/281479271743489.0+0.5));
@@ -544,7 +567,7 @@ static inline unsigned int ScaleQuantumT
static inline unsigned short ScaleQuantumToShort(const Quantum quantum)
{
- if (quantum <= 0.0)
+ if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
return(0);
if ((quantum/281479271743489.0) >= 65535.0)
return(65535);
Index: ImageMagick-6.8.8-1/magick/pixel-private.h
===================================================================
--- ImageMagick-6.8.8-1.orig/magick/pixel-private.h 2013-11-27 20:02:59.000000000 +0100
+++ ImageMagick-6.8.8-1/magick/pixel-private.h 2021-02-15 13:19:10.934238539 +0100
@@ -75,20 +75,6 @@ static inline MagickBooleanType IsMonoch
return(MagickFalse);
}
-static inline double PerceptibleReciprocal(const double x)
-{
- double
- sign;
-
- /*
- Return 1/x where x is perceptible (not unlimited or infinitesimal).
- */
- sign=x < 0.0 ? -1.0 : 1.0;
- if ((sign*x) >= MagickEpsilon)
- return(1.0/x);
- return(sign/MagickEpsilon);
-}
-
static inline void SetMagickPixelPacket(const Image *image,
const PixelPacket *color,const IndexPacket *index,MagickPixelPacket *pixel)
{