From 03507b81f86f329275154e0d07e3c74cd0a229fc Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 25 Nov 2018 08:56:55 -0500 Subject: [PATCH] Only validate XMP profile once --- MagickCore/profile.c | 41 ++++++++++++++++++++++++++++++++++++++++- MagickCore/property.c | 37 ------------------------------------- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/MagickCore/profile.c b/MagickCore/profile.c index d4a653e36..5bd241a6d 100644 --- a/MagickCore/profile.c +++ b/MagickCore/profile.c @@ -75,7 +75,16 @@ #include "lcms2.h" #endif #endif - +#if defined(MAGICKCORE_XML_DELEGATE) +# if defined(MAGICKCORE_WINDOWS_SUPPORT) +# if !defined(__MINGW32__) +# include +# endif +# endif +# include +# include +#endif + /* Definitions */ @@ -1693,6 +1702,29 @@ static void GetProfilesFromResourceBlock(Image *image, } } +static MagickBooleanType ValidateXMPProfile(const StringInfo *profile) +{ +#if defined(MAGICKCORE_XML_DELEGATE) + { + xmlDocPtr + document; + + /* + Parse XML profile. + */ + document=xmlReadMemory((const char *) GetStringInfoDatum(profile),(int) + GetStringInfoLength(profile),"xmp.xml",NULL,XML_PARSE_NOERROR | + XML_PARSE_NOWARNING); + if (document == (xmlDocPtr) NULL) + return(MagickFalse); + xmlFreeDoc(document); + return(MagickTrue); + } +#else + return(MagickTrue); +#endif +} + static MagickBooleanType SetImageProfileInternal(Image *image,const char *name, const StringInfo *profile,const MagickBooleanType recursive, ExceptionInfo *exception) @@ -1708,6 +1740,13 @@ static MagickBooleanType SetImageProfileInternal(Image *image,const char *name, assert(image->signature == MagickCoreSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if ((LocaleCompare(name,"xmp") == 0) && + (ValidateXMPProfile(profile) == MagickFalse)) + { + (void) ThrowMagickException(exception,GetMagickModule(),ImageWarning, + "CorruptImageProfile","`%s'",name); + return(MagickFalse); + } if (image->profiles == (SplayTreeInfo *) NULL) image->profiles=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory, DestroyProfile); diff --git a/MagickCore/property.c b/MagickCore/property.c index 75ab4d560..dbf1e98aa 100644 --- a/MagickCore/property.c +++ b/MagickCore/property.c @@ -96,15 +96,6 @@ #include "lcms.h" #endif #endif -#if defined(MAGICKCORE_XML_DELEGATE) -# if defined(MAGICKCORE_WINDOWS_SUPPORT) -# if !defined(__MINGW32__) -# include -# endif -# endif -# include -# include -#endif /* Define declarations. @@ -1763,29 +1754,6 @@ static MagickBooleanType SkipXMPValue(const char *value) return(MagickTrue); } -static MagickBooleanType ValidateXMPProfile(const char *profile, - const size_t length) -{ -#if defined(MAGICKCORE_XML_DELEGATE) - { - xmlDocPtr - document; - - /* - Parse XML profile. - */ - document=xmlReadMemory(profile,(int) length,"xmp.xml",NULL, - XML_PARSE_NOERROR | XML_PARSE_NOWARNING); - if (document == (xmlDocPtr) NULL) - return(MagickFalse); - xmlFreeDoc(document); - return(MagickTrue); - } -#else - return(MagickFalse); -#endif -} - static MagickBooleanType GetXMPProperty(const Image *image,const char *property) { char @@ -1823,11 +1791,6 @@ static MagickBooleanType GetXMPProperty(const Image *image,const char *property) xmp_profile=StringInfoToString(profile); if (xmp_profile == (char *) NULL) return(MagickFalse); - if (ValidateXMPProfile(xmp_profile,GetStringInfoLength(profile)) == MagickFalse) - { - xmp_profile=DestroyString(xmp_profile); - return(MagickFalse); - } for (p=xmp_profile; *p != '\0'; p++) if ((*p == '<') && (*(p+1) == 'x')) break; -- 2.40.0