[xerces-c] 02/02: Merge pull request #28 from rouault/curl_memleak_fix
[email protected] Thu, 06 Oct 2022 12:30:58 +0000
Newsgroups
gmane.text.xml.xerces-c.devel
Message-ID
<[email protected] >
This is an automated email from the ASF dual-hosted git repository.
scantor pushed a commit to branch xerces-3.2
in repository https://gitbox.apache.org/repos/asf/xerces-c.git
commit e1665b4c4bd2f3e3ac637d36ac6515cf64c3bab2
Author: Roger Leigh <[email protected] >
AuthorDate: Tue Aug 24 06:23:42 2021 +0100
Merge pull request #28 from rouault/curl_memleak_fix
XERCESC-2218: CurlURLInputStream constructor: avoid memory leak
---
.../util/NetAccessors/Curl/CurlURLInputStream.cpp | 28 +++++++++++++++++++++-
.../util/NetAccessors/Curl/CurlURLInputStream.hpp | 2 ++
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
index 5ed659389..2980dc211 100644
--- a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
+++ b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
@@ -160,7 +160,20 @@ CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const XMLNetHTTP
while(fBufferHeadPtr == fBuffer)
{
int runningHandles = 0;
- readMore(&runningHandles);
+ try
+ {
+ readMore(&runningHandles);
+ }
+ catch(const MalformedURLException&)
+ {
+ cleanup();
+ throw;
+ }
+ catch(const NetAccessorException&)
+ {
+ cleanup();
+ throw;
+ }
if(runningHandles == 0) break;
}
@@ -174,18 +187,31 @@ CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const XMLNetHTTP
CurlURLInputStream::~CurlURLInputStream()
{
+ cleanup();
+}
+
+
+void CurlURLInputStream::cleanup()
+{
+ if (!fMulti )
+ return;
+
// Remove the easy handle from the multi stack
curl_multi_remove_handle(fMulti, fEasy);
// Cleanup the easy handle
curl_easy_cleanup(fEasy);
+ fEasy = NULL;
// Cleanup the multi handle
curl_multi_cleanup(fMulti);
+ fMulti = NULL;
if(fContentType) fMemoryManager->deallocate(fContentType);
+ fContentType = NULL;
if(fHeadersList) curl_slist_free_all(fHeadersList);
+ fHeadersList = NULL;
}
diff --git a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
index f75857b92..3900d4db5 100644
--- a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
+++ b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
@@ -61,6 +61,8 @@ private :
CurlURLInputStream(const CurlURLInputStream&);
CurlURLInputStream& operator=(const CurlURLInputStream&);
+ void cleanup();
+
static size_t staticWriteCallback(char *buffer,
size_t size,
size_t nitems,