Project not found: devel:ARM:Factory:Contrib:ILP32

File GraphicsMagick-CVE-2016-2317.patch of Package GraphicsMagick.6323

Index: GraphicsMagick-1.3.20/coders/svg.c
===================================================================
--- GraphicsMagick-1.3.20.orig/coders/svg.c	2013-03-10 00:19:31.000000000 +0100
+++ GraphicsMagick-1.3.20/coders/svg.c	2016-06-23 10:05:21.805840780 +0200
@@ -316,25 +316,22 @@ static char **GetTransformTokens(void *c
     *p,
     *q;
 
-  register long
+  register size_t
     i;
 
   SVGInfo
     *svg_info;
 
+  size_t
+    alloc_tokens;
+
   svg_info=(SVGInfo *) context;
   *number_tokens=0;
   if (text == (const char *) NULL)
     return((char **) NULL);
-  /*
-    Determine the number of arguments.
-  */
-  for (p=text; *p != '\0'; p++)
-  {
-    if (*p == '(')
-      (*number_tokens)+=2;
-  }
-  tokens=MagickAllocateMemory(char **,(*number_tokens+2)*sizeof(*tokens));
+
+  alloc_tokens=8;
+  tokens=MagickAllocateMemory(char **,(alloc_tokens+2)*sizeof(*tokens));
   if (tokens == (char **) NULL)
     {
       ThrowException3(svg_info->exception,ResourceLimitError,
@@ -350,15 +347,28 @@ static char **GetTransformTokens(void *c
   {
     if ((*q != '(') && (*q != ')') && (*q != '\0'))
       continue;
+    if (i == alloc_tokens)
+      {
+        alloc_tokens <<= 1;
+        MagickReallocMemory(char **,tokens,(alloc_tokens+2)*sizeof(*tokens));
+        if (tokens == (char **) NULL)
+          {
+            ThrowException3(svg_info->exception,ResourceLimitError,
+                            MemoryAllocationFailed,UnableToConvertStringToTokens);
+            return((char **) NULL);
+          }
+      }
     tokens[i]=AllocateString(p);
     (void) strlcpy(tokens[i],p,q-p+1);
-    Strip(tokens[i++]);
+    Strip(tokens[i]);
+    i++;
     p=q+1;
   }
   tokens[i]=AllocateString(p);
   (void) strlcpy(tokens[i],p,q-p+1);
   Strip(tokens[i++]);
   tokens[i]=(char *) NULL;
+  *number_tokens=i;
   return(tokens);
 }
 
@@ -1177,18 +1187,20 @@ static void SVGStartElement(void *contex
               IdentityAffine(&transform);
               (void) LogMagickEvent(CoderEvent,GetMagickModule(),"  ");
               tokens=GetTransformTokens(context,value,&number_tokens);
-              for (j=0; j < (number_tokens-1); j+=2)
+              if ((tokens != (char **) NULL) && (number_tokens > 0))
               {
-                keyword=(char *) tokens[j];
-                if (keyword == (char *) NULL)
-                  continue;
-                value=(char *) tokens[j+1];
-                (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                  "    %.1024s: %.1024s",keyword,value);
-                current=transform;
-                IdentityAffine(&affine);
-                switch (*keyword)
+                for (j=0; j < (number_tokens-1); j+=2)
                 {
+                  keyword=(char *) tokens[j];
+                  if (keyword == (char *) NULL)
+                    continue;
+                  value=(char *) tokens[j+1];
+                  (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                                        "    %.1024s: %.1024s",keyword,value);
+                  current=transform;
+                  IdentityAffine(&affine);
+                  switch (*keyword)
+                  {
                   case 'M':
                   case 'm':
                   {
@@ -1293,22 +1305,23 @@ static void SVGStartElement(void *contex
                   }
                   default:
                     break;
-                }
-                transform.sx=current.sx*affine.sx+current.ry*affine.rx;
-                transform.rx=current.rx*affine.sx+current.sy*affine.rx;
-                transform.ry=current.sx*affine.ry+current.ry*affine.sy;
-                transform.sy=current.rx*affine.ry+current.sy*affine.sy;
-                transform.tx=current.sx*affine.tx+current.ry*affine.ty+
-                  current.tx;
-                transform.ty=current.rx*affine.tx+current.sy*affine.ty+
-                  current.ty;
-              }
-              MVGPrintf(svg_info->file,"affine %g %g %g %g %g %g\n",
-                transform.sx,transform.rx,transform.ry,transform.sy,
-                transform.tx,transform.ty);
-              for (j=0; tokens[j] != (char *) NULL; j++)
-                MagickFreeMemory(tokens[j]);
-              MagickFreeMemory(tokens);
+                  } /* end switch */
+                  transform.sx=current.sx*affine.sx+current.ry*affine.rx;
+                  transform.rx=current.rx*affine.sx+current.sy*affine.rx;
+                  transform.ry=current.sx*affine.ry+current.ry*affine.sy;
+                  transform.sy=current.rx*affine.ry+current.sy*affine.sy;
+                  transform.tx=current.sx*affine.tx+current.ry*affine.ty+
+                    current.tx;
+                  transform.ty=current.rx*affine.tx+current.sy*affine.ty+
+                    current.ty;
+                } /* end for */
+                MVGPrintf(svg_info->file,"affine %g %g %g %g %g %g\n",
+                          transform.sx,transform.rx,transform.ry,transform.sy,
+                          transform.tx,transform.ty);
+                for (j=0; tokens[j] != (char *) NULL; j++)
+                  MagickFreeMemory(tokens[j]);
+                MagickFreeMemory(tokens);
+              } /* end if */
               break;
             }
           if (LocaleCompare(keyword,"gradientUnits") == 0)
@@ -1746,6 +1759,8 @@ static void SVGStartElement(void *contex
               IdentityAffine(&transform);
               (void) LogMagickEvent(CoderEvent,GetMagickModule(),"  ");
               tokens=GetTransformTokens(context,value,&number_tokens);
+              if ((tokens != (char **) NULL) && (number_tokens > 0))
+                {
               for (j=0; j < (number_tokens-1); j+=2)
               {
                 keyword=(char *) tokens[j];
@@ -1873,8 +1888,10 @@ static void SVGStartElement(void *contex
               MVGPrintf(svg_info->file,"affine %g %g %g %g %g %g\n",
                 transform.sx,transform.rx,transform.ry,transform.sy,
                 transform.tx,transform.ty);
-              for (j=0; tokens[j] != (char *) NULL; j++)
-                MagickFreeMemory(tokens[j]);
+                }
+              if (number_tokens > 0)
+                for (j=0; tokens[j] != (char *) NULL; j++)
+                  MagickFreeMemory(tokens[j]);
               MagickFreeMemory(tokens);
               break;
             }
Index: GraphicsMagick-1.3.20/magick/render.c
===================================================================
--- GraphicsMagick-1.3.20.orig/magick/render.c	2016-06-23 10:05:21.649838266 +0200
+++ GraphicsMagick-1.3.20/magick/render.c	2016-06-23 10:05:21.805840780 +0200
@@ -432,7 +432,7 @@ ConvertPathToPolygon(const PathInfo *pat
               {
                 number_edges<<=1;
                 MagickReallocMemory(EdgeInfo *,polygon_info->edges,
-                  number_edges*sizeof(EdgeInfo));
+                                    MagickArraySize(number_edges,sizeof(EdgeInfo)));
                 if (polygon_info->edges == (EdgeInfo *) NULL)
                   return((PolygonInfo *) NULL);
               }
@@ -484,7 +484,7 @@ ConvertPathToPolygon(const PathInfo *pat
           {
             number_edges<<=1;
             MagickReallocMemory(EdgeInfo *,polygon_info->edges,
-              number_edges*sizeof(EdgeInfo));
+                                MagickArraySize(number_edges,sizeof(EdgeInfo)));
             if (polygon_info->edges == (EdgeInfo *) NULL)
               return((PolygonInfo *) NULL);
           }
@@ -517,7 +517,7 @@ ConvertPathToPolygon(const PathInfo *pat
     if (n == number_points)
       {
         number_points<<=1;
-        MagickReallocMemory(PointInfo *,points,number_points*sizeof(PointInfo));
+        MagickReallocMemory(PointInfo *,points,MagickArraySize(number_points,sizeof(PointInfo)));
         if (points == (PointInfo *) NULL)
           return((PolygonInfo *) NULL);
       }
@@ -541,7 +541,7 @@ ConvertPathToPolygon(const PathInfo *pat
             {
               number_edges<<=1;
               MagickReallocMemory(EdgeInfo *,polygon_info->edges,
-                number_edges*sizeof(EdgeInfo));
+                                  MagickArraySize(number_edges,sizeof(EdgeInfo)));
               if (polygon_info->edges == (EdgeInfo *) NULL)
                 return((PolygonInfo *) NULL);
             }
@@ -2309,7 +2309,7 @@ DrawImage(Image *image,const DrawInfo *d
               {
                 n++;
                 MagickReallocMemory(DrawInfo **,graphic_context,
-                  (n+1)*sizeof(DrawInfo *));
+                                    MagickArraySize((n+1),sizeof(DrawInfo *)));
                 if (graphic_context == (DrawInfo **) NULL)
                   {
                     ThrowException3(&image->exception,ResourceLimitError,
@@ -2671,7 +2671,7 @@ DrawImage(Image *image,const DrawInfo *d
         continue;
       number_points<<=1;
       MagickReallocMemory(PrimitiveInfo *,primitive_info,
-        number_points*sizeof(PrimitiveInfo));
+                          MagickArraySize(number_points,sizeof(PrimitiveInfo)));
       if (primitive_info == (PrimitiveInfo *) NULL)
         {
           ThrowException3(&image->exception,ResourceLimitError,
@@ -2777,7 +2777,7 @@ DrawImage(Image *image,const DrawInfo *d
       {
         number_points+=length+1;
         MagickReallocMemory(PrimitiveInfo *,primitive_info,
-          number_points*sizeof(PrimitiveInfo));
+                            MagickArraySize(number_points,sizeof(PrimitiveInfo)));
         if (primitive_info == (PrimitiveInfo *) NULL)
           {
             ThrowException3(&image->exception,ResourceLimitError,
@@ -5468,8 +5468,8 @@ TraceStrokePolygon(const DrawInfo *draw_
     if (q >= (max_strokes-6*BezierQuantum-360))
       {
          max_strokes+=6*BezierQuantum+360;
-         MagickReallocMemory(PointInfo *,path_p,max_strokes*sizeof(PointInfo));
-         MagickReallocMemory(PointInfo *,path_q,max_strokes*sizeof(PointInfo));
+         MagickReallocMemory(PointInfo *,path_p,MagickArraySize(max_strokes,sizeof(PointInfo)));
+         MagickReallocMemory(PointInfo *,path_q,MagickArraySize(max_strokes,sizeof(PointInfo)));
          if ((path_p == (PointInfo *) NULL) || (path_q == (PointInfo *) NULL))
            {
              MagickFreeMemory(polygon_primitive);
openSUSE Build Service is sponsored by