Commit fe0a49a58 for imagemagick.org

commit fe0a49a58ac5b7a18ff2618b6207dcad71123e43
Author: Dirk Lemstra <dirk@lemstra.org>
Date:   Sat Feb 7 09:31:08 2026 +0100

    Fixed possible memory leak in multiple coders that write raw pixel data (GHSA-wfx3-6g53-9fgc)

diff --git a/coders/bgr.c b/coders/bgr.c
index 4b4939054..cac739db7 100644
--- a/coders/bgr.c
+++ b/coders/bgr.c
@@ -1344,7 +1344,10 @@ static MagickBooleanType WriteBGRImage(const ImageInfo *image_info,Image *image,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1371,7 +1374,10 @@ static MagickBooleanType WriteBGRImage(const ImageInfo *image_info,Image *image,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1398,7 +1404,10 @@ static MagickBooleanType WriteBGRImage(const ImageInfo *image_info,Image *image,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1428,7 +1437,10 @@ static MagickBooleanType WriteBGRImage(const ImageInfo *image_info,Image *image,
             status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
               AppendBinaryBlobMode,exception);
             if (status == MagickFalse)
-              return(status);
+              {
+                quantum_info=DestroyQuantumInfo(quantum_info);
+                return(status);
+              }
             for (y=0; y < (ssize_t) image->rows; y++)
             {
               const Quantum
diff --git a/coders/cmyk.c b/coders/cmyk.c
index 3929bad95..e55da8b65 100644
--- a/coders/cmyk.c
+++ b/coders/cmyk.c
@@ -1471,7 +1471,10 @@ static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1498,7 +1501,10 @@ static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1525,7 +1531,10 @@ static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1552,7 +1561,10 @@ static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1581,7 +1593,10 @@ static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
             status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
               AppendBinaryBlobMode,exception);
             if (status == MagickFalse)
-              return(status);
+              {
+                quantum_info=DestroyQuantumInfo(quantum_info);
+                return(status);
+              }
             for (y=0; y < (ssize_t) image->rows; y++)
             {
               const Quantum
diff --git a/coders/gray.c b/coders/gray.c
index fc06b77f2..c30a166c0 100644
--- a/coders/gray.c
+++ b/coders/gray.c
@@ -1002,7 +1002,10 @@ static MagickBooleanType WriteGRAYImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1032,7 +1035,10 @@ static MagickBooleanType WriteGRAYImage(const ImageInfo *image_info,
             status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
               AppendBinaryBlobMode,exception);
             if (status == MagickFalse)
-              return(status);
+              {
+                quantum_info=DestroyQuantumInfo(quantum_info);
+                return(status);
+              }
             for (y=0; y < (ssize_t) image->rows; y++)
             {
               const Quantum
diff --git a/coders/rgb.c b/coders/rgb.c
index a0c95fa2e..300f11b75 100644
--- a/coders/rgb.c
+++ b/coders/rgb.c
@@ -1586,7 +1586,10 @@ static MagickBooleanType WriteRGBImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1613,7 +1616,10 @@ static MagickBooleanType WriteRGBImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1640,7 +1646,10 @@ static MagickBooleanType WriteRGBImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           const Quantum
@@ -1669,7 +1678,10 @@ static MagickBooleanType WriteRGBImage(const ImageInfo *image_info,
             status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
               AppendBinaryBlobMode,exception);
             if (status == MagickFalse)
-              return(status);
+              {
+                quantum_info=DestroyQuantumInfo(quantum_info);
+                return(status);
+              }
             for (y=0; y < (ssize_t) image->rows; y++)
             {
               const Quantum
diff --git a/coders/ycbcr.c b/coders/ycbcr.c
index 7feacd238..e16cd1d88 100644
--- a/coders/ycbcr.c
+++ b/coders/ycbcr.c
@@ -1291,7 +1291,10 @@ static MagickBooleanType WriteYCBCRImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           p=GetVirtualPixels(image,0,y,image->columns,1,exception);
@@ -1315,7 +1318,10 @@ static MagickBooleanType WriteYCBCRImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           p=GetVirtualPixels(image,0,y,image->columns,1,exception);
@@ -1339,7 +1345,10 @@ static MagickBooleanType WriteYCBCRImage(const ImageInfo *image_info,
         status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
           AppendBinaryBlobMode,exception);
         if (status == MagickFalse)
-          return(status);
+          {
+            quantum_info=DestroyQuantumInfo(quantum_info);
+            return(status);
+          }
         for (y=0; y < (ssize_t) image->rows; y++)
         {
           p=GetVirtualPixels(image,0,y,image->columns,1,exception);
@@ -1365,7 +1374,10 @@ static MagickBooleanType WriteYCBCRImage(const ImageInfo *image_info,
             status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
               AppendBinaryBlobMode,exception);
             if (status == MagickFalse)
-              return(status);
+              {
+                quantum_info=DestroyQuantumInfo(quantum_info);
+                return(status);
+              }
             for (y=0; y < (ssize_t) image->rows; y++)
             {
               p=GetVirtualPixels(image,0,y,image->columns,1,exception);