Commit 4686f1fbb for imagemagick.org

commit 4686f1fbbb2db88dcd1d83835c056f1b55b40c3c
Author: Dirk Lemstra <dirk@lemstra.org>
Date:   Mon Nov 9 19:32:58 2026 +0100

    Lower the maximum precision in the KERNEL encoder and write the data per row.

diff --git a/coders/kernel.c b/coders/kernel.c
index fe746889a..5b97503e6 100644
--- a/coders/kernel.c
+++ b/coders/kernel.c
@@ -156,12 +156,21 @@ static MagickBooleanType WriteKERNELImage(const ImageInfo *image_info,
   Image *image,ExceptionInfo *exception)
 {
   char
-    buffer[MagickPathExtent];
+    buffer[64],
+    *q,
+    *row;
+
+  int
+    precision;

   MagickBooleanType
     status;

+  size_t
+    length;
+
   ssize_t
+    count,
     y;

   /*
@@ -183,12 +192,17 @@ static MagickBooleanType WriteKERNELImage(const ImageInfo *image_info,
   */
   if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
     (void) TransformImageColorspace(image,sRGBColorspace,exception);
-  (void) FormatLocaleString(buffer,MagickPathExtent,"%gx%g:",(double)
+  (void) FormatLocaleString(buffer,sizeof(buffer),"%gx%g:",(double)
     image->columns,(double) image->rows);
   (void) WriteBlobString(image,buffer);
   /*
     Convert MIFF to KERNEL raster pixels.
   */
+  precision=MagickMin(GetMagickPrecision(),17);
+  length=(size_t) precision+10;
+  row=(char *) AcquireQuantumMemory(image->columns+1,length);
+  if (row == (char *) NULL)
+    ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
   for (y=0; y < (ssize_t) image->rows; y++)
   {
     const Quantum
@@ -200,21 +214,28 @@ static MagickBooleanType WriteKERNELImage(const ImageInfo *image_info,
     p=GetVirtualPixels(image,0,y,image->columns,1,exception);
     if (p == (const Quantum *) NULL)
       break;
+    q=row;
     for (x=0; x < (ssize_t) image->columns; x++)
     {
       if ((x != 0) || (y != 0))
-        (void) WriteBlobString(image,",");
+        *q++=',';
       if (((image->alpha_trait != BlendPixelTrait) != 0) &&
           (GetPixelAlpha(image,p) < OpaqueAlpha/2))
-        (void) WriteBlobString(image,"-");
+        *q++='-';
       else
         {
-          (void) FormatLocaleString(buffer,MagickPathExtent,"%.*g",
-            GetMagickPrecision(),QuantumScale*GetPixelIntensity(image,p));
-          (void) WriteBlobString(image,buffer);
+          (void) FormatLocaleString(q,length,"%.*g",
+            precision,QuantumScale*GetPixelIntensity(image,p));
+          q+=strlen(q);
         }
       p+=(ptrdiff_t) GetPixelChannels(image);
     }
+    count=WriteBlob(image,(size_t) (q-row),(const unsigned char *) row);
+    if (count != (ssize_t) (q-row))
+      {
+        status=MagickFalse;
+        break;
+      }
     if (image->previous == (Image *) NULL)
       {
         status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
@@ -223,7 +244,9 @@ static MagickBooleanType WriteKERNELImage(const ImageInfo *image_info,
           break;
       }
   }
-  (void) WriteBlobString(image,"\n");
+  row=(char *) RelinquishMagickMemory(row);
+  if (status != MagickFalse)
+    (void) WriteBlobString(image,"\n");
   if (CloseBlob(image) == MagickFalse)
     status=MagickFalse;
   return(status);