Commit 41c2d472d for imagemagick.org

commit 41c2d472d6a352955580893eb6be94131a0ac92f
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Sun May 3 07:47:43 2026 -0400

    optimized CheckPrimitiveExtent() method

diff --git a/MagickCore/draw.c b/MagickCore/draw.c
index 2025f3547..3f81879fa 100644
--- a/MagickCore/draw.c
+++ b/MagickCore/draw.c
@@ -92,7 +92,7 @@
 */
 #define AntialiasThreshold  (1.0/3.0)
 #define BezierQuantum  200
-#define PrimitiveExtentPad  4296
+#define PrimitiveExtentPad  4296.0
 #define MaxBezierCoordinates  67108864
 #define ThrowPointExpectedException(token,exception) \
 { \
@@ -2283,53 +2283,41 @@ static inline MagickBooleanType CheckPrimitiveExtent(MVGInfo *mvg_info,
   const double pad)
 {
   PrimitiveInfo
-    *clone_info,
     *primitive_info;

   size_t
-    extent;
+    extent,
+    proposed_extent;

   ssize_t
     i;

-  /*
-    Pad is double, but extent must be element count.
-  */
-  extent=(size_t) (mvg_info->offset+pad+PrimitiveExtentPad+1);
+  if ((mvg_info == (MVGInfo *) NULL) ||
+      (mvg_info->primitive_info == (PrimitiveInfo **) NULL) ||
+      (*mvg_info->primitive_info == (PrimitiveInfo *) NULL) ||
+      (mvg_info->extent == (size_t *) NULL))
+    return(MagickFalse);
+  proposed_extent=(double) mvg_info->offset+pad+PrimitiveExtentPad+1.0;
+  if ((proposed_extent <= 0.0) || (proposed_extent > (double) SIZE_MAX))
+    return(MagickFalse);
+  extent=(size_t) ceil(proposed_extent);
   if (extent <= *mvg_info->extent)
     return(MagickTrue);
-  if (extent >= GetMaxMemoryRequest())
+  if (extent > (GetMaxMemoryRequest()/sizeof(PrimitiveInfo)))
     return(MagickFalse);
-  /*
-    Attempt to grow the primitive_info array.
-  */
-  primitive_info=(*mvg_info->primitive_info);
-  clone_info=(PrimitiveInfo *) ResizeQuantumMemory(primitive_info,extent,
-    sizeof(PrimitiveInfo));
-  if (clone_info != (PrimitiveInfo *) NULL)
-    primitive_info=clone_info;
-  else
+  primitive_info=(PrimitiveInfo *) ResizeQuantumMemory(
+    *mvg_info->primitive_info,extent,sizeof(PrimitiveInfo));
+  if (primitive_info == (PrimitiveInfo *) NULL)
     {
       /*
-        Allocation failed: reset to minimal safe state.
+        Leave old buffer intact; report failure.
       */
-      for (i=0; primitive_info[i].primitive != UndefinedPrimitive; i++)
-        if (primitive_info[i].text != (char *) NULL)
-          primitive_info[i].text=DestroyString(primitive_info[i].text);
-      primitive_info=(PrimitiveInfo *) RelinquishMagickMemory(primitive_info);
-      primitive_info=(PrimitiveInfo *) AcquireCriticalMemory((size_t)
-        (PrimitiveExtentPad+1)*sizeof(PrimitiveInfo));
-      (void) memset(primitive_info,0,(size_t) (PrimitiveExtentPad+1)*
-        sizeof(PrimitiveInfo));
-      *mvg_info->primitive_info=primitive_info;
-      *mvg_info->extent=(size_t) (PrimitiveExtentPad+1);
-      mvg_info->offset=0;
-      ThrowMagickException(mvg_info->exception,GetMagickModule(),
+      ThrowMagickException(mvg_info->exception, GetMagickModule(),
         ResourceLimitError,"MemoryAllocationFailed","`%s'","");
       return(MagickFalse);
     }
   /*
-    Initialize newly allocated elements.
+    Commit updated buffer.
   */
   for (i=(ssize_t) *mvg_info->extent; i < (ssize_t) extent; i++)
   {