[llvm] r309151 - Unlink nodes instead of copying, to avoid memory problems.
Eric Beckmann via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 26 11:33:21 PDT 2017
Author: ecbeckmann
Date: Wed Jul 26 11:33:21 2017
New Revision: 309151
URL: http://llvm.org/viewvc/llvm-project?rev=309151&view=rev
Log:
Unlink nodes instead of copying, to avoid memory problems.
Modified:
llvm/trunk/lib/WindowsManifest/WindowsManifestMerger.cpp
Modified: llvm/trunk/lib/WindowsManifest/WindowsManifestMerger.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/WindowsManifest/WindowsManifestMerger.cpp?rev=309151&r1=309150&r2=309151&view=diff
==============================================================================
--- llvm/trunk/lib/WindowsManifest/WindowsManifestMerger.cpp (original)
+++ llvm/trunk/lib/WindowsManifest/WindowsManifestMerger.cpp Wed Jul 26 11:33:21 2017
@@ -93,21 +93,18 @@ Error mergeAttributes(XMLNodeImpl Origin
Error treeMerge(XMLNodeImpl OriginalRoot, XMLNodeImpl AdditionalRoot) {
#if LLVM_LIBXML2_ENABLED
XMLNodeImpl AdditionalFirstChild = AdditionalRoot->children;
+ xmlNode StoreNext;
for (XMLNodeImpl Child = AdditionalFirstChild; Child; Child = Child->next) {
XMLNodeImpl OriginalChildWithName;
if (!isMergeableElement(Child->name) ||
!(OriginalChildWithName =
getChildWithName(OriginalRoot, Child->name))) {
- XMLNodeImpl NewChild = xmlCopyNode(Child, 1);
- if (!NewChild)
- return make_error<WindowsManifestError>(Twine("error when copying ") +
- FROM_XML_CHAR(Child->name));
- if (NewChild->ns)
- xmlFreeNs(NewChild->ns); // xmlCopyNode explicitly defines default
- // namespace, undo this here.
- if (!xmlAddChild(OriginalRoot, NewChild))
+ StoreNext.next = Child->next;
+ xmlUnlinkNode(Child);
+ if (!xmlAddChild(OriginalRoot, Child))
return make_error<WindowsManifestError>(Twine("could not merge ") +
- FROM_XML_CHAR(NewChild->name));
+ FROM_XML_CHAR(Child->name));
+ Child = &StoreNext;
} else if (auto E = treeMerge(OriginalChildWithName, Child)) {
return E;
}
@@ -167,11 +164,7 @@ Error WindowsManifestMerger::merge(const
return E;
}
} else {
- XMLNodeImpl NewChild = xmlCopyNode(AdditionalRoot, 1);
- if (!NewChild)
- return make_error<WindowsManifestError>("could not copy manifest");
- if (!xmlAddChild(CombinedRoot, NewChild))
- return make_error<WindowsManifestError>("could not append manifest");
+ return make_error<WindowsManifestError>("multiple root nodes");
}
}
MergedDocs.push_back(ManifestXML);
More information about the llvm-commits
mailing list