File ImageMagick-CVE-2026-25576.patch of Package ImageMagick.42999
From 44b3140f3414ebc02c5fa8b80551f7d33950a87a Mon Sep 17 00:00:00 2001
From: Dirk Lemstra <dirk@lemstra.org>
Date: Sun, 25 Jan 2026 19:32:52 +0100
Subject: [PATCH] Fixed out of bounds read in multiple coders that read raw
pixel data
(https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-jv4p-gjwq-9r2j)
---
coders/bgr.c | 22 ++++++++++++----------
coders/cmyk.c | 26 ++++++++++++++------------
coders/gray.c | 16 +++++++++-------
coders/raw.c | 4 +++-
coders/rgb.c | 22 ++++++++++++----------
coders/ycbcr.c | 22 ++++++++++++----------
6 files changed, 62 insertions(+), 50 deletions(-)
Index: ImageMagick-6.8.8-1/coders/bgr.c
===================================================================
--- ImageMagick-6.8.8-1.orig/coders/bgr.c
+++ ImageMagick-6.8.8-1/coders/bgr.c
@@ -98,6 +98,14 @@ static MagickBooleanType
% o exception: return any errors or warnings in this structure.
%
*/
+
+static inline ssize_t MagickMin(const ssize_t x,const ssize_t y)
+{
+ if (x < y)
+ return(x);
+ return(y);
+}
+
static Image *ReadBGRImage(const ImageInfo *image_info,
ExceptionInfo *exception)
{
@@ -124,6 +132,7 @@ static Image *ReadBGRImage(const ImageIn
length;
ssize_t
+ columns,
count,
y;
@@ -190,6 +199,7 @@ static Image *ReadBGRImage(const ImageIn
length=0;
scene=0;
status=MagickTrue;
+ columns=(ssize_t) MagickMin(image->columns,canvas_image->columns);
do
{
/*
@@ -247,7 +257,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
SetPixelGreen(q,GetPixelGreen(p));
@@ -330,7 +340,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
switch (quantum_type)
{
@@ -426,7 +436,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
p++;
@@ -479,7 +489,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelGreen(q,GetPixelGreen(p));
p++;
@@ -532,7 +542,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelBlue(q,GetPixelBlue(p));
p++;
@@ -594,7 +604,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelOpacity(q,GetPixelOpacity(p));
p++;
@@ -682,7 +692,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
p++;
@@ -750,7 +760,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelGreen(q,GetPixelGreen(p));
p++;
@@ -818,7 +828,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelBlue(q,GetPixelBlue(p));
p++;
@@ -887,7 +897,7 @@ static Image *ReadBGRImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelOpacity(q,GetPixelOpacity(p));
p++;
Index: ImageMagick-6.8.8-1/coders/cmyk.c
===================================================================
--- ImageMagick-6.8.8-1.orig/coders/cmyk.c
+++ ImageMagick-6.8.8-1/coders/cmyk.c
@@ -70,6 +70,14 @@
static MagickBooleanType
WriteCMYKImage(const ImageInfo *,Image *);
+
+static inline ssize_t MagickMin(const ssize_t x,const ssize_t y)
+{
+ if (x < y)
+ return(x);
+ return(y);
+}
+
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
@@ -123,6 +131,7 @@ static Image *ReadCMYKImage(const ImageI
length;
ssize_t
+ columns,
count,
y;
@@ -195,6 +204,7 @@ static Image *ReadCMYKImage(const ImageI
length=0;
scene=0;
status=MagickTrue;
+ columns=(ssize_t) MagickMin(image->columns,canvas_image->columns);
do
{
/*
@@ -261,7 +271,7 @@ static Image *ReadCMYKImage(const ImageI
break;
canvas_indexes=GetVirtualIndexQueue(canvas_image);
indexes=GetAuthenticIndexQueue(image);
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
SetPixelGreen(q,GetPixelGreen(p));
@@ -355,7 +365,7 @@ static Image *ReadCMYKImage(const ImageI
break;
canvas_indexes=GetVirtualIndexQueue(canvas_image);
indexes=GetAuthenticIndexQueue(image);
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
switch (quantum_type)
{
@@ -452,7 +462,7 @@ static Image *ReadCMYKImage(const ImageI
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
p++;
@@ -505,7 +515,7 @@ static Image *ReadCMYKImage(const ImageI
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelGreen(q,GetPixelGreen(p));
p++;
@@ -558,7 +568,7 @@ static Image *ReadCMYKImage(const ImageI
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelBlue(q,GetPixelBlue(p));
p++;
@@ -619,7 +629,7 @@ static Image *ReadCMYKImage(const ImageI
break;
canvas_indexes=GetVirtualIndexQueue(canvas_image);
indexes=GetAuthenticIndexQueue(image);
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelIndex(indexes+x,GetPixelIndex(
canvas_indexes+image->extract_info.x+x));
@@ -676,7 +686,7 @@ static Image *ReadCMYKImage(const ImageI
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelOpacity(q,GetPixelOpacity(p));
p++;
@@ -768,7 +778,7 @@ static Image *ReadCMYKImage(const ImageI
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
p++;
@@ -840,7 +850,7 @@ static Image *ReadCMYKImage(const ImageI
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelGreen(q,GetPixelGreen(p));
p++;
@@ -912,7 +922,7 @@ static Image *ReadCMYKImage(const ImageI
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelBlue(q,GetPixelBlue(p));
p++;
@@ -992,7 +1002,7 @@ static Image *ReadCMYKImage(const ImageI
break;
canvas_indexes=GetVirtualIndexQueue(canvas_image);
indexes=GetAuthenticIndexQueue(image);
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelIndex(indexes+x,GetPixelIndex(
canvas_indexes+image->extract_info.x+x));
@@ -1067,7 +1077,7 @@ static Image *ReadCMYKImage(const ImageI
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelOpacity(q,GetPixelOpacity(p));
p++;
Index: ImageMagick-6.8.8-1/coders/gray.c
===================================================================
--- ImageMagick-6.8.8-1.orig/coders/gray.c
+++ ImageMagick-6.8.8-1/coders/gray.c
@@ -71,6 +71,13 @@
static MagickBooleanType
WriteGRAYImage(const ImageInfo *,Image *);
+static inline ssize_t MagickMin(const ssize_t x,const ssize_t y)
+{
+ if (x < y)
+ return(x);
+ return(y);
+}
+
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
@@ -121,6 +128,7 @@ static Image *ReadGRAYImage(const ImageI
length;
ssize_t
+ columns,
count,
y;
@@ -182,6 +190,7 @@ static Image *ReadGRAYImage(const ImageI
scene=0;
count=0;
length=0;
+ columns=(ssize_t) MagickMin(image->columns,canvas_image->columns);
do
{
/*
@@ -229,7 +238,7 @@ static Image *ReadGRAYImage(const ImageI
1,exception);
if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
SetPixelGreen(q,GetPixelGreen(p));
Index: ImageMagick-6.8.8-1/coders/raw.c
===================================================================
--- ImageMagick-6.8.8-1.orig/coders/raw.c
+++ ImageMagick-6.8.8-1/coders/raw.c
@@ -67,6 +67,14 @@
static MagickBooleanType
WriteRAWImage(const ImageInfo *,Image *);
+
+static inline ssize_t MagickMin(const ssize_t x,const ssize_t y)
+{
+ if (x < y)
+ return(x);
+ return(y);
+}
+
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
@@ -115,6 +123,7 @@ static Image *ReadRAWImage(const ImageIn
length;
ssize_t
+ columns,
count,
y;
@@ -172,6 +181,7 @@ static Image *ReadRAWImage(const ImageIn
scene=0;
count=0;
length=0;
+ columns=(ssize_t) MagickMin(image->columns,canvas_image->columns);
do
{
/*
@@ -218,7 +228,7 @@ static Image *ReadRAWImage(const ImageIn
1,exception);
if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
SetPixelGreen(q,GetPixelGreen(p));
Index: ImageMagick-6.8.8-1/coders/rgb.c
===================================================================
--- ImageMagick-6.8.8-1.orig/coders/rgb.c
+++ ImageMagick-6.8.8-1/coders/rgb.c
@@ -71,6 +71,14 @@
static MagickBooleanType
WriteRGBImage(const ImageInfo *,Image *);
+
+static inline ssize_t MagickMin(const ssize_t x,const ssize_t y)
+{
+ if (x < y)
+ return(x);
+ return(y);
+}
+
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
@@ -123,6 +131,7 @@ static Image *ReadRGBImage(const ImageIn
length;
ssize_t
+ columns,
count,
y;
@@ -197,6 +206,7 @@ static Image *ReadRGBImage(const ImageIn
length=0;
scene=0;
status=MagickTrue;
+ columns=(ssize_t) MagickMin(image->columns,canvas_image->columns);
do
{
/*
@@ -254,7 +264,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
SetPixelGreen(q,GetPixelGreen(p));
@@ -339,7 +349,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
switch (quantum_type)
{
@@ -435,7 +445,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
p++;
@@ -488,7 +498,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelGreen(q,GetPixelGreen(p));
p++;
@@ -541,7 +551,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelBlue(q,GetPixelBlue(p));
p++;
@@ -603,7 +613,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelOpacity(q,GetPixelOpacity(p));
p++;
@@ -690,7 +700,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
p++;
@@ -758,7 +768,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelGreen(q,GetPixelGreen(p));
p++;
@@ -827,7 +837,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelBlue(q,GetPixelBlue(p));
p++;
@@ -897,7 +907,7 @@ static Image *ReadRGBImage(const ImageIn
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelOpacity(q,GetPixelOpacity(p));
p++;
Index: ImageMagick-6.8.8-1/coders/ycbcr.c
===================================================================
--- ImageMagick-6.8.8-1.orig/coders/ycbcr.c
+++ ImageMagick-6.8.8-1/coders/ycbcr.c
@@ -69,6 +69,14 @@
*/
static MagickBooleanType
WriteYCBCRImage(const ImageInfo *,Image *);
+
+static inline ssize_t MagickMin(const ssize_t x,const ssize_t y)
+{
+ if (x < y)
+ return(x);
+ return(y);
+}
+
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -130,6 +138,7 @@ static Image *ReadYCBCRImage(const Image
length;
ssize_t
+ columns,
count,
y;
@@ -200,6 +209,7 @@ static Image *ReadYCBCRImage(const Image
length=0;
scene=0;
status=MagickTrue;
+ columns=(ssize_t) MagickMin(image->columns,canvas_image->columns);
do
{
/*
@@ -249,7 +259,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
SetPixelGreen(q,GetPixelGreen(p));
@@ -322,7 +332,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
switch (quantum_type)
{
@@ -404,7 +414,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
p++;
@@ -448,7 +458,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelGreen(q,GetPixelGreen(p));
p++;
@@ -492,7 +502,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelBlue(q,GetPixelBlue(p));
p++;
@@ -539,7 +549,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelOpacity(q,GetPixelOpacity(p));
p++;
@@ -617,7 +627,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelRed(q,GetPixelRed(p));
p++;
@@ -675,7 +685,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelGreen(q,GetPixelGreen(p));
p++;
@@ -733,7 +743,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelBlue(q,GetPixelBlue(p));
p++;
@@ -793,7 +803,7 @@ static Image *ReadYCBCRImage(const Image
if ((p == (const PixelPacket *) NULL) ||
(q == (PixelPacket *) NULL))
break;
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < columns; x++)
{
SetPixelOpacity(q,GetPixelOpacity(p));
p++;