diff options
author | Eric Beckmann <ecbeckmann@google.com> | 2017-07-26 18:33:21 +0000 |
---|---|---|
committer | Eric Beckmann <ecbeckmann@google.com> | 2017-07-26 18:33:21 +0000 |
commit | 6caf08711082c97116c296f8d8e6fae9fa86f88f (patch) | |
tree | 299e711ed65fa388e1b4865517ca111d687c3bcb /lib/WindowsManifest | |
parent | a65cddf557403bd39853a1a1fa6c212c703e9658 (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.cpp | 21 |
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); |