Skip to content

Commit 53c08df

Browse files
authored
[llvm-mt] Use XmlDeleter to free xmlFreeDoc (#128472)
Fixes memory leak on error in llvm-mt. Previous https://reviews.llvm.org/D37321 missed this spot.
1 parent f63c5f3 commit 53c08df

File tree

1 file changed

+6
-12
lines changed

1 file changed

+6
-12
lines changed

llvm/lib/WindowsManifest/WindowsManifestMerger.cpp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ void WindowsManifestError::log(raw_ostream &OS) const { OS << Msg; }
3232

3333
class WindowsManifestMerger::WindowsManifestMergerImpl {
3434
public:
35-
~WindowsManifestMergerImpl();
3635
Error merge(MemoryBufferRef Manifest);
3736
std::unique_ptr<MemoryBuffer> getMergedManifest();
3837

@@ -45,7 +44,7 @@ class WindowsManifestMerger::WindowsManifestMergerImpl {
4544
void operator()(xmlDoc *Ptr) { xmlFreeDoc(Ptr); }
4645
};
4746
xmlDocPtr CombinedDoc = nullptr;
48-
std::vector<xmlDocPtr> MergedDocs;
47+
std::vector<std::unique_ptr<xmlDoc, XmlDeleter>> MergedDocs;
4948
bool Merged = false;
5049
int BufferSize = 0;
5150
std::unique_ptr<xmlChar, XmlDeleter> Buffer;
@@ -611,11 +610,6 @@ static void checkAndStripPrefixes(xmlNodePtr Node,
611610
}
612611
}
613612

614-
WindowsManifestMerger::WindowsManifestMergerImpl::~WindowsManifestMergerImpl() {
615-
for (auto &Doc : MergedDocs)
616-
xmlFreeDoc(Doc);
617-
}
618-
619613
Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
620614
MemoryBufferRef Manifest) {
621615
if (Merged)
@@ -626,17 +620,17 @@ Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
626620
"attempted to merge empty manifest");
627621
xmlSetGenericErrorFunc((void *)this,
628622
WindowsManifestMergerImpl::errorCallback);
629-
xmlDocPtr ManifestXML = xmlReadMemory(
623+
std::unique_ptr<xmlDoc, XmlDeleter> ManifestXML(xmlReadMemory(
630624
Manifest.getBufferStart(), Manifest.getBufferSize(), "manifest.xml",
631-
nullptr, XML_PARSE_NOBLANKS | XML_PARSE_NODICT);
625+
nullptr, XML_PARSE_NOBLANKS | XML_PARSE_NODICT));
632626
xmlSetGenericErrorFunc(nullptr, nullptr);
633627
if (auto E = getParseError())
634628
return E;
635-
xmlNodePtr AdditionalRoot = xmlDocGetRootElement(ManifestXML);
629+
xmlNodePtr AdditionalRoot = xmlDocGetRootElement(ManifestXML.get());
636630
stripComments(AdditionalRoot);
637631
setAttributeNamespaces(AdditionalRoot);
638632
if (CombinedDoc == nullptr) {
639-
CombinedDoc = ManifestXML;
633+
CombinedDoc = ManifestXML.get();
640634
} else {
641635
xmlNodePtr CombinedRoot = xmlDocGetRootElement(CombinedDoc);
642636
if (!xmlStringsEqual(CombinedRoot->name, AdditionalRoot->name) ||
@@ -648,7 +642,7 @@ Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
648642
return E;
649643
}
650644
}
651-
MergedDocs.push_back(ManifestXML);
645+
MergedDocs.push_back(std::move(ManifestXML));
652646
return Error::success();
653647
}
654648

0 commit comments

Comments
 (0)