]> granicus.if.org Git - llvm/commitdiff
Unlink nodes instead of copying, to avoid memory problems.
authorEric Beckmann <ecbeckmann@google.com>
Wed, 26 Jul 2017 18:33:21 +0000 (18:33 +0000)
committerEric Beckmann <ecbeckmann@google.com>
Wed, 26 Jul 2017 18:33:21 +0000 (18:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309151 91177308-0d34-0410-b5e6-96231b3b80d8

lib/WindowsManifest/WindowsManifestMerger.cpp

index 0c9e7fda5795af78e268b0e6a0f2b8e993532617..ce68f4db5519a91479d2d2dbf3723d3f90b05e63 100644 (file)
@@ -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);