summaryrefslogtreecommitdiffstats
path: root/llvm/lib/WindowsManifest
diff options
context:
space:
mode:
authorEric Beckmann <ecbeckmann@google.com>2017-07-26 18:33:21 +0000
committerEric Beckmann <ecbeckmann@google.com>2017-07-26 18:33:21 +0000
commit6ba5c8138779860a228e7327a44f47cf7f4db819 (patch)
treeb153f2b552d1e79d9f761dd3f318d0a9c58136ba /llvm/lib/WindowsManifest
parent40f59b8596cf168759948b15a1c0701531087a32 (diff)
downloadbcm5719-llvm-6ba5c8138779860a228e7327a44f47cf7f4db819.tar.gz
bcm5719-llvm-6ba5c8138779860a228e7327a44f47cf7f4db819.zip
Unlink nodes instead of copying, to avoid memory problems.
llvm-svn: 309151
Diffstat (limited to 'llvm/lib/WindowsManifest')
-rw-r--r--llvm/lib/WindowsManifest/WindowsManifestMerger.cpp21
1 files changed, 7 insertions, 14 deletions
diff --git a/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp b/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp
index 0c9e7fda579..ce68f4db551 100644
--- a/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp
+++ b/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp
@@ -93,21 +93,18 @@ Error mergeAttributes(XMLNodeImpl OriginalNode, XMLNodeImpl AdditionalNode) {
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 MemoryBuffer &Manifest) {
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);
OpenPOWER on IntegriCloud