Index: GraphicsMagick-1.2.5/coders/svg.c
===================================================================
--- GraphicsMagick-1.2.5.orig/coders/svg.c	2016-06-23 13:26:44.292195459 +0200
+++ GraphicsMagick-1.2.5/coders/svg.c	2016-06-23 13:48:41.893792637 +0200
@@ -203,7 +203,7 @@ static double GetUserSpaceCoordinateValu
 
   assert(string != (const char *) NULL);
   p=(char *) string;
-  GetToken(p,&p,token);
+  (void) MagickGetToken(p,&p,token,MaxTextExtent);
   value=atof(token);
   if (strchr(token,'%') != (char *) NULL)
     {
@@ -219,7 +219,7 @@ static double GetUserSpaceCoordinateValu
       beta=value-svg_info->view_box.height;
       return(sqrt(alpha*alpha+beta*beta)/sqrt(2.0)/100.0);
     }
-  GetToken(p,&p,token);
+  (void) MagickGetToken(p,&p,token,MaxTextExtent);
   if (LocaleNCompare(token,"cm",2) == 0)
     return(72.0*svg_info->scale[0]/2.54*value);
   if (LocaleNCompare(token,"em",2) == 0)
@@ -633,6 +633,7 @@ static void SVGStartDocument(void *conte
   */
   (void) LogMagickEvent(CoderEvent,GetMagickModule(),"  SAX.startDocument()");
   svg_info=(SVGInfo *) context;
+  DestroyExceptionInfo(svg_info->exception);
   GetExceptionInfo(svg_info->exception);
   parser=svg_info->parser;
   svg_info->document=xmlNewDoc(parser->version);
@@ -672,19 +673,19 @@ static void SVGStartElement(void *contex
   const xmlChar **attributes)
 {
   char
-    *color,
+    *color = NULL,
     id[MaxTextExtent],
-    *p,
+    *p = NULL,
     token[MaxTextExtent],
     **tokens,
-    *units;
+    *units = NULL;
 
   const char
-    *keyword,
-    *value;
+    *keyword = NULL,
+    *value = NULL;
 
   int
-    number_tokens;
+    number_tokens = 0;
 
   SVGInfo
     *svg_info;
@@ -698,6 +699,8 @@ static void SVGStartElement(void *contex
   */
   (void) LogMagickEvent(CoderEvent,GetMagickModule(),
     "  SAX.startElement(%.1024s",name);
+  id[0]='\0';
+  token[0]='\0';
   svg_info=(SVGInfo *) context;
   svg_info->n++;
   MagickReallocMemory(double *,svg_info->scale,(svg_info->n+1)*sizeof(double));
@@ -712,7 +715,8 @@ static void SVGStartElement(void *contex
   units=AllocateString("userSpaceOnUse");
   value=(const char *) NULL;
   if (attributes != (const xmlChar **) NULL)
-    for (i=0; (attributes[i] != (const xmlChar *) NULL); i+=2)
+    for (i=0; (svg_info->exception->severity < ErrorException) &&
+           (attributes[i] != (const xmlChar *) NULL); i+=2)
     {
       keyword=(const char *) attributes[i];
       value=(const char *) attributes[i+1];
@@ -759,6 +763,12 @@ static void SVGStartElement(void *contex
             {
               svg_info->bounds.height=
                 GetUserSpaceCoordinateValue(svg_info,-1,value);
+              if (svg_info->bounds.height <= 0.0)
+                {
+                  ThrowException(svg_info->exception,CorruptImageError,
+                                 NegativeOrZeroImageSize,(char *) NULL);
+                  goto svg_start_element_error;
+                }
               break;
             }
           break;
@@ -791,6 +801,12 @@ static void SVGStartElement(void *contex
             {
               svg_info->bounds.width=
                 GetUserSpaceCoordinateValue(svg_info,1,value);
+              if (svg_info->bounds.width <= 0.0)
+                {
+                  ThrowException(svg_info->exception,CorruptImageError,
+                                 NegativeOrZeroImageSize,(char *) NULL);
+                  goto svg_start_element_error;
+                }
               break;
             }
           break;
@@ -1185,27 +1201,27 @@ static void SVGStartElement(void *contex
                     if (LocaleCompare(keyword,"matrix") == 0)
                       {
                         p=(char *) value;
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.sx=atof(value);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.rx=atof(token);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.ry=atof(token);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.sy=atof(token);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.tx=atof(token);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.ty=atof(token);
                         break;
                       }
@@ -1317,6 +1333,12 @@ static void SVGStartElement(void *contex
             {
               svg_info->bounds.height=
                 GetUserSpaceCoordinateValue(svg_info,-1,value);
+              if (svg_info->bounds.height <= 0.0)
+                {
+                  ThrowException(svg_info->exception,CorruptImageError,
+                                 NegativeOrZeroImageSize,(char *) NULL);
+                  goto svg_start_element_error;
+                }
               break;
             }
           if (LocaleCompare(keyword,"href") == 0)
@@ -1755,27 +1777,27 @@ static void SVGStartElement(void *contex
                     if (LocaleCompare(keyword,"matrix") == 0)
                       {
                         p=(char *) value;
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.sx=atof(value);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.rx=atof(token);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.ry=atof(token);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.sy=atof(token);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.tx=atof(token);
-                        GetToken(p,&p,token);
+                        (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         if (*token == ',')
-                          GetToken(p,&p,token);
+                          (void) MagickGetToken(p,&p,token,MaxTextExtent);
                         affine.ty=atof(token);
                         break;
                       }
@@ -1886,22 +1908,30 @@ static void SVGStartElement(void *contex
           if (LocaleCompare(keyword,"viewBox") == 0)
             {
               p=(char *) value;
-              GetToken(p,&p,token);
+              (void) MagickGetToken(p,&p,token,MaxTextExtent);
               svg_info->view_box.x=atof(token);
-              GetToken(p,&p,token);
+              (void) MagickGetToken(p,&p,token,MaxTextExtent);
               if (*token == ',')
-                GetToken(p,&p,token);
+                (void) MagickGetToken(p,&p,token,MaxTextExtent);
               svg_info->view_box.y=atof(token);
-              GetToken(p,&p,token);
+              (void) MagickGetToken(p,&p,token,MaxTextExtent);
               if (*token == ',')
-                GetToken(p,&p,token);
+                (void) MagickGetToken(p,&p,token,MaxTextExtent);
               svg_info->view_box.width=atof(token);
-              if (svg_info->bounds.width == 0)
-                svg_info->bounds.width=svg_info->view_box.width;
-              GetToken(p,&p,token);
+              (void) MagickGetToken(p,&p,token,MaxTextExtent);
               if (*token == ',')
-                GetToken(p,&p,token);
+                (void) MagickGetToken(p,&p,token,MaxTextExtent);
               svg_info->view_box.height=atof(token);
+              if (svg_info->view_box.width < 0.0 ||
+                  svg_info->view_box.height < 0.0)
+                {
+                  ThrowException(svg_info->exception,CorruptImageError,
+                                 NegativeOrZeroImageSize,
+                                 svg_info->image->filename);
+                  goto svg_start_element_error;
+                }
+              if (svg_info->bounds.width == 0)
+                svg_info->bounds.width=svg_info->view_box.width;
               if (svg_info->bounds.height == 0)
                 svg_info->bounds.height=svg_info->view_box.height;
               break;
@@ -1915,6 +1945,12 @@ static void SVGStartElement(void *contex
             {
               svg_info->bounds.width=
                 GetUserSpaceCoordinateValue(svg_info,1,value);
+              if (svg_info->bounds.width <= 0.0)
+                {
+                  ThrowException(svg_info->exception,CorruptImageError,
+                                 NegativeOrZeroImageSize,(char *) NULL);
+                  goto svg_start_element_error;
+                }
               break;
             }
           break;
@@ -2032,9 +2068,21 @@ static void SVGStartElement(void *contex
             sx,
             sy;
 
+          if (svg_info->bounds.width < 0.0 || svg_info->bounds.height < 0.0)
+            {
+              ThrowException(svg_info->exception,CorruptImageError,
+                             NegativeOrZeroImageSize,(char *) NULL);
+              goto svg_start_element_error;
+            }
           if ((svg_info->view_box.width == 0.0) ||
               (svg_info->view_box.height == 0.0))
             svg_info->view_box=svg_info->bounds;
+          if (svg_info->view_box.width < 0.0 || svg_info->view_box.height < 0.0)
+            {
+              ThrowException(svg_info->exception,CorruptImageError,
+                             NegativeOrZeroImageSize,(char *) NULL);
+              goto svg_start_element_error;
+            }
           SetGeometry(svg_info->image,&page);
           page.width=(unsigned long) svg_info->bounds.width;
           page.height=(unsigned long) svg_info->bounds.height;
@@ -2076,10 +2124,12 @@ static void SVGStartElement(void *contex
         }
     }
 #endif
+  /* Error dispatch point */
+ svg_start_element_error:;
+
   (void) LogMagickEvent(CoderEvent,GetMagickModule(),"  )");
   MagickFreeMemory(units);
-  if (color != (char *) NULL)
-    MagickFreeMemory(color);
+  MagickFreeMemory(color);
 }
 
 static void SVGEndElement(void *context,const xmlChar *name)
@@ -2470,7 +2520,7 @@ static void SVGWarning(void *context,con
 #else
   (void) vsnprintf(reason,MaxTextExtent,format,operands);
 #endif
-  ThrowException2(svg_info->exception,DelegateWarning,reason,(char *) NULL);
+  ThrowException2(svg_info->exception,CoderWarning,reason,(char *) NULL);
   va_end(operands);
 }
 
@@ -2741,6 +2791,7 @@ static Image *ReadSVGImage(const ImageIn
   /*
     Free resources.
   */
+  MagickFreeMemory(svg_info.size);
   if (svg_info.title != (char *) NULL)
     {
       if (image != (Image *) NULL)
@@ -2753,6 +2804,7 @@ static Image *ReadSVGImage(const ImageIn
         (void) SetImageAttribute(image,"comment",svg_info.comment);
       MagickFreeMemory(svg_info.comment);
     }
+  (void) memset(&svg_info,0,sizeof(SVGInfo));
   (void) LiberateTemporaryFile(filename);
   return(image);
 }
@@ -3077,7 +3129,8 @@ static unsigned int WriteSVGImage(const
     i;
 
   size_t
-    length;
+    length,
+    token_max_length;
 
   SVGInfo
     svg_info;
@@ -3124,6 +3177,7 @@ static unsigned int WriteSVGImage(const
     ThrowWriterException(ResourceLimitError,MemoryAllocationFailed,image);
   IdentityAffine(&affine);
   token=AllocateString(attribute->value);
+  token_max_length=strlen(token);
   active=False;
   n=0;
   status=True;
@@ -3132,7 +3186,7 @@ static unsigned int WriteSVGImage(const
     /*
       Interpret graphic primitive.
     */
-    GetToken(q,&q,keyword);
+    MagickGetToken(q,&q,keyword,MaxTextExtent);
     if (*keyword == '\0')
       break;
     if (*keyword == '#')
@@ -3168,33 +3222,33 @@ static unsigned int WriteSVGImage(const
       {
         if (LocaleCompare("affine",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             affine.sx=atof(token);
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
             affine.rx=atof(token);
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
             affine.ry=atof(token);
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
             affine.sy=atof(token);
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
             affine.tx=atof(token);
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
             affine.ty=atof(token);
             break;
           }
         if (LocaleCompare("angle",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             affine.rx=atof(token);
             affine.ry=atof(token);
             break;
@@ -3223,21 +3277,21 @@ static unsigned int WriteSVGImage(const
       {
         if (LocaleCompare("clip-path",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"clip-path:url(#%.1024s);",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("clip-rule",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"clip-rule:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("clip-units",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"clipPathUnits=%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
@@ -3260,7 +3314,7 @@ static unsigned int WriteSVGImage(const
       {
         if (LocaleCompare("decorate",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"text-decoration:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
@@ -3284,56 +3338,56 @@ static unsigned int WriteSVGImage(const
       {
         if (LocaleCompare("fill",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"fill:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("fill-rule",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"fill-rule:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("fill-opacity",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"fill-opacity:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("font-family",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"font-family:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("font-stretch",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"font-stretch:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("font-style",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"font-style:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("font-size",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"font-size:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("font-weight",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"font-weight:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
@@ -3346,19 +3400,19 @@ static unsigned int WriteSVGImage(const
       {
         if (LocaleCompare("gradient-units",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             break;
           }
         if (LocaleCompare("text-align",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"text-align %.1024s ",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("text-anchor",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"text-anchor %.1024s ",token);
             (void) WriteBlobString(image,message);
             break;
@@ -3371,7 +3425,7 @@ static unsigned int WriteSVGImage(const
       {
         if (LocaleCompare("image",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             primitive_type=ImagePrimitive;
             break;
           }
@@ -3405,7 +3459,7 @@ static unsigned int WriteSVGImage(const
       {
         if (LocaleCompare("opacity",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"opacity %.1024s ",token);
             (void) WriteBlobString(image,message);
             break;
@@ -3438,7 +3492,7 @@ static unsigned int WriteSVGImage(const
           }
         if (LocaleCompare("pop",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (LocaleCompare("clip-path",token) == 0)
               {
                 (void) WriteBlobString(image,"</clipPath>\n");
@@ -3474,10 +3528,10 @@ static unsigned int WriteSVGImage(const
           }
         if (LocaleCompare("push",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (LocaleCompare("clip-path",token) == 0)
               {
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 FormatString(message,"<clipPath id=\"%s\">\n",token);
                 (void) WriteBlobString(image,message);
                 break;
@@ -3489,26 +3543,26 @@ static unsigned int WriteSVGImage(const
               }
             if (LocaleCompare("gradient",token) == 0)
               {
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 (void) strlcpy(name,token,MaxTextExtent);
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 (void) strlcpy(type,token,MaxTextExtent);
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 svg_info.segment.x1=atof(token);
                 svg_info.element.cx=atof(token);
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 if (*token == ',')
-                  GetToken(q,&q,token);
+                  MagickGetToken(q,&q,token,token_max_length);
                 svg_info.segment.y1=atof(token);
                 svg_info.element.cy=atof(token);
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 if (*token == ',')
-                  GetToken(q,&q,token);
+                  MagickGetToken(q,&q,token,token_max_length);
                 svg_info.segment.x2=atof(token);
                 svg_info.element.major=atof(token);
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 if (*token == ',')
-                  GetToken(q,&q,token);
+                  MagickGetToken(q,&q,token,token_max_length);
                 svg_info.segment.y2=atof(token);
                 svg_info.element.minor=atof(token);
                 FormatString(message,"<%sGradient id=\"%s\" x1=\"%g\" "
@@ -3517,9 +3571,9 @@ static unsigned int WriteSVGImage(const
                   svg_info.segment.y2);
                 if (LocaleCompare(type,"radial") == 0)
                   {
-                    GetToken(q,&q,token);
+                    MagickGetToken(q,&q,token,token_max_length);
                     if (*token == ',')
-                      GetToken(q,&q,token);
+                      MagickGetToken(q,&q,token,token_max_length);
                     svg_info.element.angle=atof(token);
                     FormatString(message,"<%sGradient id=\"%s\" cx=\"%g\" "
                       "cy=\"%g\" r=\"%g\" fx=\"%g\" fy=\"%g\">\n",type,name,
@@ -3543,21 +3597,21 @@ static unsigned int WriteSVGImage(const
               }
             if (LocaleCompare("pattern",token) == 0)
               {
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 (void) strlcpy(name,token,MaxTextExtent);
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 svg_info.bounds.x=atof(token);
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 if (*token == ',')
-                  GetToken(q,&q,token);
+                  MagickGetToken(q,&q,token,token_max_length);
                 svg_info.bounds.y=atof(token);
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 if (*token == ',')
-                  GetToken(q,&q,token);
+                  MagickGetToken(q,&q,token,token_max_length);
                 svg_info.bounds.width=atof(token);
-                GetToken(q,&q,token);
+                MagickGetToken(q,&q,token,token_max_length);
                 if (*token == ',')
-                  GetToken(q,&q,token);
+                  MagickGetToken(q,&q,token,token_max_length);
                 svg_info.bounds.height=atof(token);
                 FormatString(message,"<pattern id=\"%s\" x=\"%g\" y=\"%g\" "
                   "width=\"%g\" height=\"%g\">\n",name,svg_info.bounds.x,
@@ -3586,7 +3640,7 @@ static unsigned int WriteSVGImage(const
           }
         if (LocaleCompare("rotate",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"rotate(%.1024s) ",token);
             (void) WriteBlobString(image,message);
             break;
@@ -3599,24 +3653,24 @@ static unsigned int WriteSVGImage(const
       {
         if (LocaleCompare("scale",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             affine.sx=atof(token);
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
             affine.sy=atof(token);
             break;
           }
         if (LocaleCompare("skewX",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"skewX(%.1024s) ",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("skewY",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"skewY(%.1024s) ",token);
             (void) WriteBlobString(image,message);
             break;
@@ -3626,9 +3680,9 @@ static unsigned int WriteSVGImage(const
             char
               color[MaxTextExtent];
 
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             (void) strlcpy(color,token,MaxTextExtent);
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,
               "  <stop offset=\"%s\" stop-color=\"%s\" />\n",token,color);
             (void) WriteBlobString(image,message);
@@ -3636,14 +3690,14 @@ static unsigned int WriteSVGImage(const
           }
         if (LocaleCompare("stroke",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"stroke:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("stroke-antialias",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"stroke-antialias:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
@@ -3656,62 +3710,62 @@ static unsigned int WriteSVGImage(const
                   k;
 
                 p=q;
-                GetToken(p,&p,token);
+                (void) MagickGetToken(p,&p,token,MaxTextExtent);
                 for (k=0; IsPoint(token); k++)
-                  GetToken(p,&p,token);
+                  (void) MagickGetToken(p,&p,token,MaxTextExtent);
                 (void) WriteBlobString(image,"stroke-dasharray:");
                 for (j=0; j < k; j++)
                 {
-                  GetToken(q,&q,token);
+                  MagickGetToken(q,&q,token,token_max_length);
                   FormatString(message,"%.1024s ",token);
                   (void) WriteBlobString(image,message);
                 }
                 (void) WriteBlobString(image,";");
                 break;
               }
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"stroke-dasharray:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("stroke-dashoffset",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"stroke-dashoffset:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("stroke-linecap",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"stroke-linecap:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("stroke-linejoin",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"stroke-linejoin:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("stroke-miterlimit",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"stroke-miterlimit:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("stroke-opacity",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"stroke-opacity:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
           }
         if (LocaleCompare("stroke-width",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"stroke-width:%.1024s;",token);
             (void) WriteBlobString(image,message);
             continue;
@@ -3729,7 +3783,7 @@ static unsigned int WriteSVGImage(const
           }
         if (LocaleCompare("text-antialias",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             FormatString(message,"text-antialias:%.1024s;",token);
             (void) WriteBlobString(image,message);
             break;
@@ -3741,11 +3795,11 @@ static unsigned int WriteSVGImage(const
           }
         if (LocaleCompare("translate",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             affine.tx=atof(token);
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
             affine.ty=atof(token);
             break;
           }
@@ -3757,16 +3811,16 @@ static unsigned int WriteSVGImage(const
       {
         if (LocaleCompare("viewbox",keyword) == 0)
           {
-            GetToken(q,&q,token);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
-            GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
-            GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
+            MagickGetToken(q,&q,token,token_max_length);
             if (*token == ',')
-              GetToken(q,&q,token);
-            GetToken(q,&q,token);
+              MagickGetToken(q,&q,token,token_max_length);
+            MagickGetToken(q,&q,token,token_max_length);
             break;
           }
         status=False;
@@ -3794,15 +3848,15 @@ static unsigned int WriteSVGImage(const
       */
       if (!IsPoint(q))
         break;
-      GetToken(q,&q,token);
+      MagickGetToken(q,&q,token,token_max_length);
       point.x=atof(token);
-      GetToken(q,&q,token);
+      MagickGetToken(q,&q,token,token_max_length);
       if (*token == ',')
-        GetToken(q,&q,token);
+        MagickGetToken(q,&q,token,token_max_length);
       point.y=atof(token);
-      GetToken(q,(char **) NULL,token);
+      MagickGetToken(q,(char **) NULL,token,token_max_length);
       if (*token == ',')
-        GetToken(q,&q,token);
+        MagickGetToken(q,&q,token,token_max_length);
       primitive_info[i].primitive=primitive_type;
       primitive_info[i].point=point;
       primitive_info[i].coordinates=0;
@@ -3997,7 +4051,7 @@ static unsigned int WriteSVGImage(const
         int
           number_attributes;
 
-        GetToken(q,&q,token);
+        MagickGetToken(q,&q,token,token_max_length);
         number_attributes=1;
         for (p=token; *p != '\0'; p++)
           if (isalpha((int) *p))
@@ -4027,7 +4081,7 @@ static unsigned int WriteSVGImage(const
             status=False;
             break;
           }
-        GetToken(q,&q,token);
+        MagickGetToken(q,&q,token,token_max_length);
         if (LocaleCompare("point",token) == 0)
           primitive_info[j].method=PointMethod;
         if (LocaleCompare("replace",token) == 0)
@@ -4050,7 +4104,7 @@ static unsigned int WriteSVGImage(const
             status=False;
             break;
           }
-        GetToken(q,&q,token);
+        MagickGetToken(q,&q,token,token_max_length);
         (void) FormatString(message,"  <text x=\"%g\" y=\"%g\">",
           primitive_info[j].point.x,primitive_info[j].point.y);
         (void) WriteBlobString(image,message);
@@ -4072,7 +4126,7 @@ static unsigned int WriteSVGImage(const
             status=False;
             break;
           }
-        GetToken(q,&q,token);
+        MagickGetToken(q,&q,token,token_max_length);
         (void) FormatString(message,"  <image x=\"%g\" y=\"%g\" "
           "width=\"%g\" height=\"%g\" xlink:href=\"%.1024s\"/>\n",
           primitive_info[j].point.x,primitive_info[j].point.y,
Index: GraphicsMagick-1.2.5/magick/utility.c
===================================================================
--- GraphicsMagick-1.2.5.orig/magick/utility.c	2016-06-23 13:26:44.036191335 +0200
+++ GraphicsMagick-1.2.5/magick/utility.c	2016-06-23 13:26:44.300195589 +0200
@@ -5467,3 +5467,124 @@ MagickExport char *TranslateTextEx(const
     MagickFreeMemory(text);
   return(translated_text);
 }
+
+MagickExport size_t MagickGetToken(const char *start,char **end,char *token,
+                                   const size_t buffer_length)
+{
+  register char
+    *p;
+
+  register size_t
+    i;
+
+  register size_t
+    length = buffer_length - 1;
+
+  double
+    double_val;
+
+  assert(start != (const char *) NULL);
+  assert(token != (char *) NULL);
+
+  i=0;
+  p=(char *) start;
+
+  if (*p != '\0')
+  {
+    while (isspace((int)(unsigned char) (*p)) && (*p != '\0'))
+      p++;
+    switch (*p)
+    {
+      case '"':
+      case '\'':
+      case '{':
+      {
+        register char
+          escape;
+
+        escape=(*p);
+        if (escape == '{')
+          escape='}';
+        for (p++; *p != '\0'; p++)
+        {
+          if ((*p == '\\') && ((*(p+1) == escape) || (*(p+1) == '\\')))
+            p++;
+          else
+            if (*p == escape)
+              {
+                p++;
+                break;
+              }
+          if (i < length)
+            token[i++]=(*p);
+        }
+        break;
+      }
+      default:
+      {
+        char
+          *q;
+
+        double_val=strtod(p,&q);
+        (void) double_val;
+        if (p != q)
+          {
+            for ( ; p < q; p++)
+              if (i < length)
+                token[i++]=(*p);
+            if (*p == '%')
+              if (i < length)
+                {
+                  token[i++]=(*p);
+                  p++;
+                }
+            break;
+          }
+        if ((*p != '\0') && !isalpha((int) *p) && (*p != *DirectorySeparator) &&
+	    (*p != '#') && (*p != '<'))
+          {
+            if (i < length)
+              {
+                token[i++]=(*p);
+                p++;
+              }
+            break;
+          }
+        for ( ; *p != '\0'; p++)
+        {
+          if ((isspace((int)(unsigned char) *p) || (*p == '=')) && (*(p-1) != '\\'))
+            break;
+          if (i < length)
+            token[i++]=(*p);
+          if (*p == '(')
+            for (p++; *p != '\0'; p++)
+            {
+              if (i < length)
+                token[i++]=(*p);
+              if ((*p == ')') && (*(p-1) != '\\'))
+                break;
+            }
+        }
+        break;
+      }
+    }
+  }
+  token[i]='\0';
+  {
+    char
+      *r;
+
+    /*
+      Parse token in form "url(#%s)"
+    */
+    if ((LocaleNCompare(token,"url(#",5) == 0) &&
+        ((r = strrchr(token,')')) != NULL))
+    {
+      *r='\0';
+      (void) memmove(token,token+5,r-token+1);
+    }
+  }
+  if (end != (char **) NULL)
+    *end=p;
+  return (p-start+1);
+}
