Commit 4403defdd for imagemagick.org
commit 4403defdd4e23f98d40ab21dda38f20e5d51e09f
Author: Cristy <urban-warrior@imagemagick.org>
Date: Wed Feb 4 19:23:38 2026 -0500
https://github.com/ImageMagick/ImageMagick/issues/8556
diff --git a/MagickCore/image-private.h b/MagickCore/image-private.h
index f0472f38b..93edd75a6 100644
--- a/MagickCore/image-private.h
+++ b/MagickCore/image-private.h
@@ -43,6 +43,7 @@ extern "C" {
#define LoadImageTag "Load/Image"
#define Magick2PI 6.28318530717958647692528676655900576839433879875020
#define MagickAbsoluteValue(x) ((x) < 0 ? -(x) : (x))
+#define MAGICK_INT_MAX (INT_MAX)
#define MagickPHI 1.61803398874989484820458683436563811772030917980576
#define MagickPI2 1.57079632679489661923132169163975144209858469968755
#define MagickPI 3.1415926535897932384626433832795028841971693993751058209749445923078164062
@@ -69,6 +70,30 @@ extern "C" {
#define UndefinedCompressionQuality 0UL
#define UndefinedTicksPerSecond 100L
+static inline int CastDoubleToInt(const double x)
+{
+ double
+ value;
+
+ if (IsNaN(x) != 0)
+ {
+ errno=ERANGE;
+ return(0);
+ }
+ value=(x < 0.0) ? ceil(x) : floor(x);
+ if (value < 0.0)
+ {
+ errno=ERANGE;
+ return(0);
+ }
+ if (value > ((double) MAGICK_INT_MAX))
+ {
+ errno=ERANGE;
+ return(MAGICK_INT_MAX);
+ }
+ return((int) value);
+}
+
static inline ptrdiff_t CastDoubleToPtrdiffT(const double x)
{
double
diff --git a/coders/dcm.c b/coders/dcm.c
index f4fa2cb6e..9f6338499 100644
--- a/coders/dcm.c
+++ b/coders/dcm.c
@@ -2921,7 +2921,7 @@ static MagickBooleanType ReadDCMPixels(Image *image,DCMInfo *info,
scaled_value=pixel_value*info->rescale_slope+
info->rescale_intercept;
- index=(int) scaled_value;
+ index=CastDoubleToInt(scaled_value);
if (info->window_width != 0)
{
double
@@ -2936,10 +2936,11 @@ static MagickBooleanType ReadDCMPixels(Image *image,DCMInfo *info,
index=0;
else
if (scaled_value > window_max)
- index=(int) info->max_value;
+ index=CastDoubleToInt(info->max_value);
else
- index=(int) (info->max_value*(((scaled_value-
- info->window_center-0.5)/(info->window_width-1))+0.5));
+ index=CastDoubleToInt(info->max_value*(((scaled_value-
+ info->window_center-0.5)*MagickSafeReciprocal(
+ info->window_width-1.0))+0.5));
}
}
index&=(ssize_t) info->mask;