summaryrefslogtreecommitdiff
path: root/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
commit6caf08711082c97116c296f8d8e6fae9fa86f88f (patch)
tree299e711ed65fa388e1b4865517ca111d687c3bcb /lib/WindowsManifest
parenta65cddf557403bd39853a1a1fa6c212c703e9658 (diff)
Unlink nodes instead of copying, to avoid memory problems.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309151 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/WindowsManifest')
-rw-r--r--lib/WindowsManifest/WindowsManifestMerger.cpp21
1 files changed, 7 insertions, 14 deletions
diff --git a/lib/WindowsManifest/WindowsManifestMerger.cpp b/lib/WindowsManifest/WindowsManifestMerger.cpp
index 0c9e7fda579..ce68f4db551 100644
--- a/lib/WindowsManifest/WindowsManifestMerger.cpp
+++ b/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);