This is an automated email from the ASF dual-hosted git repository.
rleigh pushed a commit to branch xerces-3.2
in repository https://gitbox.apache.org/repos/asf/xerces-c.git
The following commit(s) were added to refs/heads/xerces-3.2 by this push:
new 286051c XMLReader constructor: fix memory leak when refreshRawBuffer() throws
new a3be9dc Merge pull request #31 from rouault/fix_ossfuzz_37529_backport_3_2
286051c is described below
commit 286051c73667be145b36d86febbe2ce9e48d42ff
Author: Even Rouault <[email protected]>
AuthorDate: Mon Aug 23 21:39:48 2021 +0200
XMLReader constructor: fix memory leak when refreshRawBuffer() throws
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=37529 on GDAL
The backtrace of the exception that caused the memory leak was:
```
Catchpoint 1 (exception thrown), 0x00007ffff5547672 in __cxa_throw () from /lib/x86_64-linux-gnu/libstdc++.so.6
(gdb) bt
0 0x00007ffff5547672 in __cxa_throw () from /lib/x86_64-linux-gnu/libstdc++.so.6
1 0x00007ffff24447c4 in xercesc_4_0::PosixFileMgr::fileRead (this=<optimized out>, f=<optimized out>, byteCount=<optimized out>, buffer=<optimized out>, manager=0x5555556df730)
at xercesc/util/FileManagers/PosixFileMgr.cpp:160
2 0x00007ffff24e6ec2 in xercesc_4_0::XMLReader::refreshRawBuffer (this=0x5555557e49f8) at xercesc/internal/XMLReader.cpp:1891
3 0x00007ffff24e70d4 in xercesc_4_0::XMLReader::XMLReader (this=0x5555557e49f8, pubId=<optimized out>, sysId=0x555555750920 u"/", streamToAdopt=0x55555574e838, from=<optimized out>,
type=xercesc_4_0::XMLReader::Type_General, source=xercesc_4_0::XMLReader::Source_External, throwAtEnd=false, calculateSrcOfs=false, lowWaterMark=100, version=xercesc_4_0::XMLReader::XMLV1_0,
manager=0x5555556df730) at xercesc/internal/XMLReader.cpp:130
4 0x00007ffff24ced75 in xercesc_4_0::ReaderMgr::createReader (this=this@entry=0x5555557896d8, src=..., refFrom=refFrom@entry=xercesc_4_0::XMLReader::RefFrom_NonLiteral,
type=type@entry=xercesc_4_0::XMLReader::Type_General, source=source@entry=xercesc_4_0::XMLReader::Source_External, calcSrcOfs=false, lowWaterMark=100) at ./xercesc/sax/InputSource.hpp:314
5 0x00007ffff24cb0af in xercesc_4_0::IGXMLScanner::scanReset (this=0x555555789608, src=...) at xercesc/internal/IGXMLScanner2.cpp:1286
6 0x00007ffff24c36e9 in xercesc_4_0::IGXMLScanner::scanDocument (this=0x555555789608, src=...) at xercesc/internal/IGXMLScanner.cpp:198
7 0x00007ffff250abaf in xercesc_4_0::AbstractDOMParser::parse (this=0x7fffffffc2d0, source=...) at xercesc/parsers/AbstractDOMParser.cpp:545
8 0x00007ffff24cbdbe in xercesc_4_0::IGXMLScanner::resolveSchemaGrammar (this=0x555555792f78, loc=0x5555557dd694 u"/", uri=0x555555737180 u"`", ignoreLoadSchema=<optimized out>)
at xercesc/internal/IGXMLScanner2.cpp:1895
0x00007ffff24cce7c in xercesc_4_0::IGXMLScanner::parseSchemaLocation (this=0x555555792f78, schemaLocationStr=<optimized out>, ignoreLoadSchema=false) at ./xercesc/framework/XMLBuffer.hpp:171
10 0x00007ffff24cd182 in xercesc_4_0::IGXMLScanner::scanRawAttrListforNameSpaces (this=this@entry=0x555555792f78, attCount=attCount@entry=9) at xercesc/internal/IGXMLScanner2.cpp:1649
11 0x00007ffff24c22cb in xercesc_4_0::IGXMLScanner::scanStartTagNS (this=0x555555792f78, gotData=@0x7fffffffc91f: true) at xercesc/internal/IGXMLScanner.cpp:2213
12 0x00007ffff24c3522 in xercesc_4_0::IGXMLScanner::scanContent (this=0x555555792f78) at xercesc/internal/IGXMLScanner.cpp:890
13 0x00007ffff24c3760 in xercesc_4_0::IGXMLScanner::scanDocument (this=0x555555792f78, src=...) at xercesc/internal/IGXMLScanner.cpp:217
14 0x00007ffff25158e3 in xercesc_4_0::SAX2XMLReaderImpl::parse (this=0x555555731828, source=...) at xercesc/parsers/SAX2XMLReaderImpl.cpp:409
```
---
src/xercesc/internal/ReaderMgr.cpp | 6 +++++
src/xercesc/internal/XMLReader.cpp | 47 +++++++++++++++++++++++++++++++++-----
src/xercesc/internal/XMLReader.hpp | 2 ++
3 files changed, 49 insertions(+), 6 deletions(-)
diff --git a/src/xercesc/internal/ReaderMgr.cpp b/src/xercesc/internal/ReaderMgr.cpp
index d14483e..18d8596 100644
--- a/src/xercesc/internal/ReaderMgr.cpp
+++ b/src/xercesc/internal/ReaderMgr.cpp
@@ -436,6 +436,12 @@ XMLReader* ReaderMgr::createReader( const InputSource& src
);
}
}
+ catch(const XMLPlatformUtilsException&)
+ {
+ streamJanitor.release();
+
+ throw;
+ }
catch(const OutOfMemoryException&)
{
streamJanitor.release();
diff --git a/src/xercesc/internal/XMLReader.cpp b/src/xercesc/internal/XMLReader.cpp
index 405474a..9acfad8 100644
--- a/src/xercesc/internal/XMLReader.cpp
+++ b/src/xercesc/internal/XMLReader.cpp
@@ -124,8 +124,16 @@ XMLReader::XMLReader(const XMLCh* const pubId
{
setXMLVersion(version);
- // Do an initial load of raw bytes
- refreshRawBuffer();
+ try
+ {
+ // Do an initial load of raw bytes
+ refreshRawBuffer();
+ }
+ catch (const XMLPlatformUtilsException&)
+ {
+ cleanup();
+ throw;
+ }
// Ask the transcoding service if it supports src offset info
fSrcOfsSupported = XMLPlatformUtils::fgTransService->supportsSrcOfs();
@@ -207,8 +215,16 @@ XMLReader::XMLReader(const XMLCh* const pubId
{
setXMLVersion(version);
- // Do an initial load of raw bytes
- refreshRawBuffer();
+ try
+ {
+ // Do an initial load of raw bytes
+ refreshRawBuffer();
+ }
+ catch (const XMLPlatformUtilsException&)
+ {
+ cleanup();
+ throw;
+ }
// Copy the encoding string to our member
fEncodingStr = XMLString::replicate(encodingStr, fMemoryManager);
@@ -390,8 +406,16 @@ XMLReader::XMLReader(const XMLCh* const pubId
{
setXMLVersion(version);
- // Do an initial load of raw bytes
- refreshRawBuffer();
+ try
+ {
+ // Do an initial load of raw bytes
+ refreshRawBuffer();
+ }
+ catch (const XMLPlatformUtilsException&)
+ {
+ cleanup();
+ throw;
+ }
// Ask the transcoding service if it supports src offset info
fSrcOfsSupported = XMLPlatformUtils::fgTransService->supportsSrcOfs();
@@ -456,11 +480,22 @@ XMLReader::XMLReader(const XMLCh* const pubId
XMLReader::~XMLReader()
{
+ cleanup();
+}
+
+
+void XMLReader::cleanup()
+{
fMemoryManager->deallocate(fEncodingStr);
+ fEncodingStr = NULL;
fMemoryManager->deallocate(fPublicId);
+ fPublicId = NULL;
fMemoryManager->deallocate(fSystemId);
+ fSystemId = NULL;
delete fStream;
+ fStream = NULL;
delete fTranscoder;
+ fTranscoder = NULL;
}
diff --git a/src/xercesc/internal/XMLReader.hpp b/src/xercesc/internal/XMLReader.hpp
index 966ca22..fbacb26 100644
--- a/src/xercesc/internal/XMLReader.hpp
+++ b/src/xercesc/internal/XMLReader.hpp
@@ -253,6 +253,8 @@ private:
// -----------------------------------------------------------------------
// Private helper methods
// -----------------------------------------------------------------------
+ void cleanup();
+
void checkForSwapped();
void doInitCharSizeChecks();
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.