Commit 4079949ba for imagemagick.org

commit 4079949bae0cde7e683df2e63c40f2e36f52c1b6
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Fri Jun 5 08:19:45 2026 -0400

    https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-hwf3-r46v-5ggx

diff --git a/MagickCore/string.c b/MagickCore/string.c
index a1a385060..46d115055 100644
--- a/MagickCore/string.c
+++ b/MagickCore/string.c
@@ -1494,60 +1494,64 @@ MagickExport MagickBooleanType IsStringFalse(const char *value)
 MagickExport void PrintStringInfo(FILE *file,const char *id,
   const StringInfo *string_info)
 {
-  const char
+  const unsigned char
     *p;

   size_t
     i,
     j;

+  /*
+    Check if string is printable.
+  */
   assert(id != (const char *) NULL);
   assert(string_info != (StringInfo *) NULL);
   assert(string_info->signature == MagickCoreSignature);
-  p=(char *) string_info->datum;
+  p=(const unsigned char *) string_info->datum;
   for (i=0; i < string_info->length; i++)
-  {
-    if (((int) ((unsigned char) *p) < 32) &&
-        (isspace((int) ((unsigned char) *p)) == 0))
+    if ((p[i] < 32) && (isspace((int)p[i]) == 0))
       break;
-    p++;
-  }
   (void) FormatLocaleFile(file,"%s(%.20g):\n",id,(double) string_info->length);
   if (i == string_info->length)
-    {
-      for (i=0; i < string_info->length; i++)
-        (void) fputc(string_info->datum[i],file);
-      (void) fputc('\n',file);
-      return;
-    }
+   {
+     for (i = 0; i < string_info->length; i++)
+       (void) fputc(p[i],file);
+     (void) fputc('\n',file);
+     return;
+   }
   /*
     Convert string to a HEX list.
   */
-  p=(char *) string_info->datum;
   for (i=0; i < string_info->length; i+=CharsPerLine)
   {
-    (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (CharsPerLine*i));
-    for (j=1; j <= MagickMin(string_info->length-i,CharsPerLine); j++)
+    (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) i);
+    for (j = 0; j < MagickMin(string_info->length-i, CharsPerLine); j++)
     {
-      (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
-      if ((j % 0x04) == 0)
+      (void) FormatLocaleFile(file,"%02lx",(unsigned long) (p[i+j]) & 0xff);
+      if (((j+1) % 0x04) == 0)
         (void) fputc(' ',file);
     }
-    for ( ; j <= CharsPerLine; j++)
+    /*
+      Padding.
+    */
+    for ( ; j < CharsPerLine; j++)
     {
       (void) fputc(' ',file);
       (void) fputc(' ',file);
-      if ((j % 0x04) == 0)
+      if (((j+1) % 0x04) == 0)
         (void) fputc(' ',file);
     }
     (void) fputc(' ',file);
-    for (j=1; j <= MagickMin(string_info->length-i,CharsPerLine); j++)
+    /*
+      ASCII section.
+    */
+    for (j=0; j < MagickMin(string_info->length-i,CharsPerLine); j++)
     {
-      if (isprint((int) ((unsigned char) *p)) != 0)
-        (void) fputc(*p,file);
+      unsigned char c = p[i+j];
+      if (isprint((int) c) != 0)
+        (void) fputc(c,file);
       else
         (void) fputc('-',file);
-      p++;
     }
     (void) fputc('\n',file);
   }