[llvm] [llvm-mt] Use XmlDeleter to free xmlFreeDoc (PR #128472)
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 23 22:31:09 PST 2025
https://github.com/vitalybuka created https://github.com/llvm/llvm-project/pull/128472
Fixes memory leak on error in llvm-mt.
>From 9f4796eaf35271378c4d001317b57b80ca8730a0 Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at google.com>
Date: Sun, 23 Feb 2025 22:30:53 -0800
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.4
---
.../WindowsManifest/WindowsManifestMerger.cpp | 20 +++++++++----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp b/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp
index b59b666ce04f9..4dd326fa76e01 100644
--- a/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp
+++ b/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp
@@ -40,14 +40,14 @@ class WindowsManifestMerger::WindowsManifestMergerImpl {
static void errorCallback(void *Ctx, const char *Format, ...);
Error getParseError();
#if LLVM_ENABLE_LIBXML2
- xmlDocPtr CombinedDoc = nullptr;
- std::vector<xmlDocPtr> MergedDocs;
-
- bool Merged = false;
struct XmlDeleter {
void operator()(xmlChar *Ptr) { xmlFree(Ptr); }
void operator()(xmlDoc *Ptr) { xmlFreeDoc(Ptr); }
};
+ xmlDocPtr CombinedDoc = nullptr;
+ std::vector<std::unique_ptr<xmlDoc, XmlDeleter>> MergedDocs;
+
+ bool Merged = false;
int BufferSize = 0;
std::unique_ptr<xmlChar, XmlDeleter> Buffer;
#endif
@@ -613,8 +613,6 @@ static void checkAndStripPrefixes(xmlNodePtr Node,
}
WindowsManifestMerger::WindowsManifestMergerImpl::~WindowsManifestMergerImpl() {
- for (auto &Doc : MergedDocs)
- xmlFreeDoc(Doc);
}
Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
@@ -627,17 +625,17 @@ Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
"attempted to merge empty manifest");
xmlSetGenericErrorFunc((void *)this,
WindowsManifestMergerImpl::errorCallback);
- xmlDocPtr ManifestXML = xmlReadMemory(
+ std::unique_ptr<xmlDoc, XmlDeleter> ManifestXML(xmlReadMemory(
Manifest.getBufferStart(), Manifest.getBufferSize(), "manifest.xml",
- nullptr, XML_PARSE_NOBLANKS | XML_PARSE_NODICT);
+ nullptr, XML_PARSE_NOBLANKS | XML_PARSE_NODICT));
xmlSetGenericErrorFunc(nullptr, nullptr);
if (auto E = getParseError())
return E;
- xmlNodePtr AdditionalRoot = xmlDocGetRootElement(ManifestXML);
+ xmlNodePtr AdditionalRoot = xmlDocGetRootElement(ManifestXML.get());
stripComments(AdditionalRoot);
setAttributeNamespaces(AdditionalRoot);
if (CombinedDoc == nullptr) {
- CombinedDoc = ManifestXML;
+ CombinedDoc = ManifestXML.get();
} else {
xmlNodePtr CombinedRoot = xmlDocGetRootElement(CombinedDoc);
if (!xmlStringsEqual(CombinedRoot->name, AdditionalRoot->name) ||
@@ -649,7 +647,7 @@ Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
return E;
}
}
- MergedDocs.push_back(ManifestXML);
+ MergedDocs.push_back(std::move(ManifestXML));
return Error::success();
}
More information about the llvm-commits
mailing list