diff --git a/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp b/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp --- a/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp +++ b/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp @@ -348,6 +348,8 @@ NewDefinedDefaultHref = TO_XML_CHAR(strdup(FROM_XML_CHAR(Def->href))); } } else if (!xmlStringsEqual(OriginalNsDef->href, Def->href)) { + if (NewDefinedDefaultHref) + xmlFree(const_cast(NewDefinedDefaultHref)); return make_error( Twine("conflicting namespace definitions for ") + FROM_XML_CHAR(Def->prefix)); @@ -382,6 +384,9 @@ Expected EC = searchOrDefine(OriginalDefinedDefaultHref, DominantNode); if (!EC) { + xmlFree(const_cast(OriginalDefinedDefaultHref)); + if (NewDefinedDefaultHref) + xmlFree(const_cast(NewDefinedDefaultHref)); return EC.takeError(); } xmlNsPtr PrefixDominantDefinedDefault = std::move(EC.get()); @@ -400,6 +405,8 @@ Expected EC = searchOrDefine(ClosestDefault->href, DominantNode); if (!EC) { + if (NewDefinedDefaultHref) + xmlFree(const_cast(NewDefinedDefaultHref)); return EC.takeError(); } xmlNsPtr ExplicitDefault = std::move(EC.get()); @@ -420,6 +427,10 @@ Expected EC = searchOrDefine(DominantNode->ns->href, NonDominantNode); if (!EC) { + if (OriginalDefinedDefaultHref) + xmlFree(const_cast(OriginalDefinedDefaultHref)); + if (NewDefinedDefaultHref) + xmlFree(const_cast(NewDefinedDefaultHref)); return EC.takeError(); } xmlNsPtr Explicit = std::move(EC.get());