Commit d052e8a88 for imagemagick.org

commit d052e8a88a32532f7555431217e6e809d1e8c658
Author: Dirk Lemstra <dirk@lemstra.org>
Date:   Sun Jan 25 18:38:00 2026 +0100

    Throw exception when memory allocation fails.

diff --git a/coders/msl.c b/coders/msl.c
index 53e3a95d1..8e20d171f 100644
--- a/coders/msl.c
+++ b/coders/msl.c
@@ -7312,12 +7312,35 @@ static void MSLError(void *context,const char *format,...)
 }
 #endif

+static void DestroyMSLInfo(MSLInfo *msl_info)
+{
+  while (msl_info->n >= 0)
+  {
+    if (msl_info->image[msl_info->n] != (Image *) NULL)
+      msl_info->image[msl_info->n]=DestroyImage(msl_info->image[msl_info->n]);
+    msl_info->attributes[msl_info->n]=DestroyImage(msl_info->attributes[msl_info->n]);
+    msl_info->draw_info[msl_info->n]=DestroyDrawInfo(msl_info->draw_info[msl_info->n]);
+    msl_info->image_info[msl_info->n]=DestroyImageInfo(msl_info->image_info[msl_info->n]);
+    msl_info->n--;
+  }
+  msl_info->draw_info=(DrawInfo **) RelinquishMagickMemory(msl_info->draw_info);
+  msl_info->image=(Image **) RelinquishMagickMemory(msl_info->image);
+  msl_info->attributes=(Image **) RelinquishMagickMemory(msl_info->attributes);
+  msl_info->image_info=(ImageInfo **) RelinquishMagickMemory(msl_info->image_info);
+  msl_info->group_info=(MSLGroupInfo *) RelinquishMagickMemory(msl_info->group_info);
+  if (msl_info->content != (char *) NULL)
+    msl_info->content=DestroyString(msl_info->content);
+}
+
 static MagickBooleanType ProcessMSLScript(const ImageInfo *image_info,
   Image **image,ExceptionInfo *exception)
 {
   char
     message[MagickPathExtent];

+  const char
+    *option;
+
   Image
     *msl_image;

@@ -7408,17 +7431,18 @@ static MagickBooleanType ProcessMSLScript(const ImageInfo *image_info,
   sax_handler=(&sax_modules);
   parser=xmlCreatePushParserCtxt(sax_handler,(void *) NULL,(char *) NULL,
     0,msl_image->filename);
-  if (parser != (xmlParserCtxtPtr) NULL)
+  if (parser == (xmlParserCtxtPtr) NULL)
     {
-      const char *option;
-      parser->_private=(MSLInfo *) &msl_info;
-      option = GetImageOption(image_info,"msl:parse-huge");
-      if ((option != (char *) NULL) && (IsStringTrue(option) != MagickFalse))
-        (void) xmlCtxtUseOptions(parser,XML_PARSE_HUGE);
-      option=GetImageOption(image_info,"msl:substitute-entities");
-      if ((option != (char *) NULL) && (IsStringTrue(option) != MagickFalse))
-        (void) xmlCtxtUseOptions(parser,XML_PARSE_NOENT);
+      DestroyMSLInfo(&msl_info);
+      ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed","");
     }
+  parser->_private=(MSLInfo *) &msl_info;
+  option = GetImageOption(image_info,"msl:parse-huge");
+  if ((option != (char *) NULL) && (IsStringTrue(option) != MagickFalse))
+    (void) xmlCtxtUseOptions(parser,XML_PARSE_HUGE);
+  option=GetImageOption(image_info,"msl:substitute-entities");
+  if ((option != (char *) NULL) && (IsStringTrue(option) != MagickFalse))
+    (void) xmlCtxtUseOptions(parser,XML_PARSE_NOENT);
   while (ReadBlobString(msl_image,message) != (char *) NULL)
   {
     n=(ssize_t) strlen(message);
@@ -7445,27 +7469,7 @@ static MagickBooleanType ProcessMSLScript(const ImageInfo *image_info,
   (void) LogMagickEvent(CoderEvent,GetMagickModule(),"end SAX");
   if (*image == (Image *) NULL)
     *image=CloneImage(*msl_info.image,0,0,MagickTrue,exception);
-  while (msl_info.n >= 0)
-  {
-    if (msl_info.image[msl_info.n] != (Image *) NULL)
-      msl_info.image[msl_info.n]=DestroyImage(msl_info.image[msl_info.n]);
-    msl_info.attributes[msl_info.n]=DestroyImage(
-      msl_info.attributes[msl_info.n]);
-    msl_info.draw_info[msl_info.n]=DestroyDrawInfo(
-      msl_info.draw_info[msl_info.n]);
-    msl_info.image_info[msl_info.n]=DestroyImageInfo(
-      msl_info.image_info[msl_info.n]);
-    msl_info.n--;
-  }
-  msl_info.draw_info=(DrawInfo **) RelinquishMagickMemory(msl_info.draw_info);
-  msl_info.image=(Image **) RelinquishMagickMemory(msl_info.image);
-  msl_info.attributes=(Image **) RelinquishMagickMemory(msl_info.attributes);
-  msl_info.image_info=(ImageInfo **) RelinquishMagickMemory(
-    msl_info.image_info);
-  msl_info.group_info=(MSLGroupInfo *) RelinquishMagickMemory(
-    msl_info.group_info);
-  if (msl_info.content != (char *) NULL)
-    msl_info.content=DestroyString(msl_info.content);
+  DestroyMSLInfo(&msl_info);
   if (msl_info.exception->severity != UndefinedException)
     return(MagickFalse);
   return(MagickTrue);