[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