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;