Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:yukoff:openSUSE:Leap:42.1:Backports
GraphicsMagick.6323
GraphicsMagick-CVE-2016-2318.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File GraphicsMagick-CVE-2016-2318.patch of Package GraphicsMagick.6323
Index: GraphicsMagick-1.3.21/coders/svg.c =================================================================== --- GraphicsMagick-1.3.21.orig/coders/svg.c 2016-08-05 10:39:40.293684253 +0200 +++ GraphicsMagick-1.3.21/coders/svg.c 2016-08-05 10:39:40.301684382 +0200 @@ -217,7 +217,7 @@ static double GetUserSpaceCoordinateValu assert(string != (const char *) NULL); p=(char *) string; - GetToken(p,&p,token); + (void) MagickGetToken(p,&p,token,MaxTextExtent); value=MagickAtoF(token); if (strchr(token,'%') != (char *) NULL) { @@ -233,7 +233,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) @@ -647,6 +647,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); @@ -686,19 +687,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; @@ -712,6 +713,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)); @@ -726,7 +729,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]; @@ -773,6 +777,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; @@ -805,6 +815,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; @@ -1207,27 +1223,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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(token); break; } @@ -1339,6 +1355,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) @@ -1777,27 +1799,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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(token); break; } @@ -1908,22 +1930,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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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; @@ -1937,6 +1967,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; @@ -2054,9 +2090,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; @@ -2098,10 +2146,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) @@ -2502,7 +2552,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); } @@ -2774,6 +2824,7 @@ static Image *ReadSVGImage(const ImageIn /* Free resources. */ + MagickFreeMemory(svg_info.size); if (svg_info.title != (char *) NULL) { if (image != (Image *) NULL) @@ -2786,6 +2837,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); } @@ -3116,7 +3168,8 @@ static unsigned int WriteSVGImage(const i; size_t - length; + length, + token_max_length; SVGInfo svg_info; @@ -3163,6 +3216,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; @@ -3171,7 +3225,7 @@ static unsigned int WriteSVGImage(const /* Interpret graphic primitive. */ - GetToken(q,&q,keyword); + MagickGetToken(q,&q,keyword,MaxTextExtent); if (*keyword == '\0') break; if (*keyword == '#') @@ -3207,33 +3261,33 @@ static unsigned int WriteSVGImage(const { if (LocaleCompare("affine",keyword) == 0) { - GetToken(q,&q,token); + MagickGetToken(q,&q,token,token_max_length); affine.sx=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(token); break; } if (LocaleCompare("angle",keyword) == 0) { - GetToken(q,&q,token); + MagickGetToken(q,&q,token,token_max_length); affine.rx=MagickAtoF(token); affine.ry=MagickAtoF(token); break; @@ -3262,21 +3316,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; @@ -3299,7 +3353,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; @@ -3323,56 +3377,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; @@ -3385,19 +3439,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; @@ -3410,7 +3464,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; } @@ -3444,7 +3498,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; @@ -3477,7 +3531,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"); @@ -3513,10 +3567,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; @@ -3528,26 +3582,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=MagickAtoF(token); svg_info.element.cx=MagickAtoF(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=MagickAtoF(token); svg_info.element.cy=MagickAtoF(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=MagickAtoF(token); svg_info.element.major=MagickAtoF(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=MagickAtoF(token); svg_info.element.minor=MagickAtoF(token); FormatString(message,"<%sGradient id=\"%s\" x1=\"%g\" " @@ -3556,9 +3610,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=MagickAtoF(token); FormatString(message,"<%sGradient id=\"%s\" cx=\"%g\" " "cy=\"%g\" r=\"%g\" fx=\"%g\" fy=\"%g\">\n",type,name, @@ -3582,21 +3636,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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(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=MagickAtoF(token); FormatString(message,"<pattern id=\"%s\" x=\"%g\" y=\"%g\" " "width=\"%g\" height=\"%g\">\n",name,svg_info.bounds.x, @@ -3625,7 +3679,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; @@ -3638,24 +3692,24 @@ static unsigned int WriteSVGImage(const { if (LocaleCompare("scale",keyword) == 0) { - GetToken(q,&q,token); + MagickGetToken(q,&q,token,token_max_length); affine.sx=MagickAtoF(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=MagickAtoF(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; @@ -3665,9 +3719,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); @@ -3675,14 +3729,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; @@ -3695,62 +3749,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; @@ -3768,7 +3822,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; @@ -3780,11 +3834,11 @@ static unsigned int WriteSVGImage(const } if (LocaleCompare("translate",keyword) == 0) { - GetToken(q,&q,token); + MagickGetToken(q,&q,token,token_max_length); affine.tx=MagickAtoF(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=MagickAtoF(token); break; } @@ -3796,16 +3850,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; @@ -3833,15 +3887,15 @@ static unsigned int WriteSVGImage(const */ if (!IsPoint(q)) break; - GetToken(q,&q,token); + MagickGetToken(q,&q,token,token_max_length); point.x=MagickAtoF(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=MagickAtoF(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; @@ -4036,7 +4090,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)) @@ -4066,7 +4120,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) @@ -4089,7 +4143,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); @@ -4111,7 +4165,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.3.21/magick/utility.c =================================================================== --- GraphicsMagick-1.3.21.orig/magick/utility.c 2016-08-05 10:39:40.173682324 +0200 +++ GraphicsMagick-1.3.21/magick/utility.c 2016-08-05 10:39:40.301684382 +0200 @@ -2591,98 +2591,7 @@ MagickExport void GetPathComponent(const */ MagickExport void GetToken(const char *start,char **end,char *token) { - register char - *p; - - register long - i; - - 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; - } - token[i++]=(*p); - } - break; - } - default: - { - char - *q; - - double_val=strtod(p,&q); - (void) double_val; - if (p != q) - { - for ( ; p < q; p++) - token[i++]=(*p); - if (*p == '%') - token[i++]=(*p++); - break; - } - if ((*p != '\0') && !isalpha((int) *p) && (*p != *DirectorySeparator) && - (*p != '#') && (*p != '<')) - { - token[i++]=(*p++); - break; - } - for ( ; *p != '\0'; p++) - { - if ((isspace((int)(unsigned char) *p) || (*p == '=')) && (*(p-1) != '\\')) - break; - token[i++]=(*p); - if (*p == '(') - for (p++; *p != '\0'; p++) - { - token[i++]=(*p); - if ((*p == ')') && (*(p-1) != '\\')) - break; - } - } - break; - } - } - } - token[i]='\0'; - if (LocaleNCompare(token,"url(#",5) == 0) - { - i=(long) strlen(token); - (void) strlcpy(token,token+5,MaxTextExtent); - token[i-6]='\0'; - } - if (end != (char **) NULL) - *end=p; + (void) MagickGetToken(start,end,token, MaxTextExtent); } /* @@ -6297,3 +6206,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); +} Index: GraphicsMagick-1.3.21/magick/utility.h =================================================================== --- GraphicsMagick-1.3.21.orig/magick/utility.h 2016-08-05 10:39:40.301684382 +0200 +++ GraphicsMagick-1.3.21/magick/utility.h 2016-08-05 10:42:31.748441700 +0200 @@ -156,6 +156,8 @@ extern MagickExport magick_int64_t MagickSizeStrToInt64(const char *str,const unsigned int kilo); extern MagickExport size_t + MagickGetToken(const char *start,char **end,char *token, + const size_t buffer_length), MagickStripSpacesFromString(char *string), MagickStrlCat(char *dst, const char *src, const size_t size) MAGICK_FUNC_NONNULL, MagickStrlCpy(char *dst, const char *src, const size_t size) MAGICK_FUNC_NONNULL,
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor