]> granicus.if.org Git - imagemagick/commitdiff
Added early exits for GetMultilineTypeMetrics.
authorDirk Lemstra <dirk@git.imagemagick.org>
Sat, 24 Mar 2018 20:55:41 +0000 (21:55 +0100)
committerDirk Lemstra <dirk@git.imagemagick.org>
Sat, 24 Mar 2018 20:56:18 +0000 (21:56 +0100)
MagickCore/annotate.c

index 4a63fb94f24cdd12a593f809006e8b6f38f07930..1050a72b791ccf69fe4a4f70c0f707edea8eb209 100644 (file)
@@ -782,6 +782,10 @@ MagickExport MagickBooleanType GetMultilineTypeMetrics(Image *image,
   register ssize_t
     i;
 
+  size_t
+    height,
+    count;
+
   TypeMetric
     extent;
 
@@ -799,7 +803,7 @@ MagickExport MagickBooleanType GetMultilineTypeMetrics(Image *image,
   /*
     Convert newlines to multiple lines of text.
   */
-  textlist=StringToList(draw_info->text);
+  textlist=StringToStrings(draw_info->text,&count);
   if (textlist == (char **) NULL)
     return(MagickFalse);
   annotate_info->render=MagickFalse;
@@ -812,21 +816,40 @@ MagickExport MagickBooleanType GetMultilineTypeMetrics(Image *image,
   annotate_info->text=textlist[0];
   status=GetTypeMetrics(image,annotate_info,&extent,exception);
   *metrics=extent;
-  for (i=1; textlist[i] != (char *) NULL; i++)
-  {
-    annotate_info->text=textlist[i];
-    status=GetTypeMetrics(image,annotate_info,&extent,exception);
-    if (extent.width > metrics->width)
-      *metrics=extent;
-  }
-  metrics->height=(double) (i*(size_t) (metrics->ascent-metrics->descent+0.5)+
-    (i-1)*draw_info->interline_spacing);
+  height=(count*(size_t) (metrics->ascent-metrics->descent+
+    0.5)+(count-1)*draw_info->interline_spacing);
+  if (AcquireMagickResource(HeightResource,height) == MagickFalse)
+    {
+      (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
+        "WidthOrHeightExceedsLimit","`%s'",image->filename);
+      status=MagickFalse;
+    }
+  else
+    {
+      for (i=1; i < (ssize_t) count; i++)
+      {
+        annotate_info->text=textlist[i];
+        status=GetTypeMetrics(image,annotate_info,&extent,exception);
+        if (status == MagickFalse)
+          break;
+        if (extent.width > metrics->width)
+          *metrics=extent;
+        if (AcquireMagickResource(WidthResource,extent.width) == MagickFalse)
+          {
+            (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
+              "WidthOrHeightExceedsLimit","`%s'",image->filename);
+            status=MagickFalse;
+            break;
+          }
+      }
+      metrics->height=(double) height;
+    }
   /*
     Relinquish resources.
   */
   annotate_info->text=(char *) NULL;
   annotate_info=DestroyDrawInfo(annotate_info);
-  for (i=0; textlist[i] != (char *) NULL; i++)
+  for (i=0; i < (ssize_t) count; i++)
     textlist[i]=DestroyString(textlist[i]);
   textlist=(char **) RelinquishMagickMemory(textlist);
   return(status);