1*4882a593SmuzhiyunFrom 1bdf6d8ba878c1fe1d779824be70001fc0bebd2c Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Even Rouault <even.rouault@spatialys.com> 3*4882a593SmuzhiyunDate: Fri, 27 Aug 2021 01:33:27 +0200 4*4882a593SmuzhiyunSubject: [PATCH] InMemMsgLoader::loadMsg(): fix memory leak when transcoding 5*4882a593Smuzhiyun fails. 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunSeen with the IconvGNU transcoder when parsing "<aaa.xsdopengis.net/gml\x96". 8*4882a593SmuzhiyunThe reason is that XMLString::transcode(repText2, manager) throws a TranscodingException 9*4882a593Smuzhiyunwhich causes the tmp1 string to leak. 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun``` 12*4882a593Smuzhiyun0 0x8791409 in operator new(unsigned int) /src/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:99:3 13*4882a593Smuzhiyun1 0xbd147f7 in xercesc_4_0::MemoryManagerImpl::allocate(unsigned int) gdal/xerces-c/src/xercesc/internal/MemoryManagerImpl.cpp:40:18 14*4882a593Smuzhiyun2 0xbe8c73e in xercesc_4_0::IconvGNULCPTranscoder::transcode(char const*, xercesc_4_0::MemoryManager*) gdal/xerces-c/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp:870:32 15*4882a593Smuzhiyun3 0xbc22ca2 in xercesc_4_0::XMLString::transcode(char const*, xercesc_4_0::MemoryManager*) gdal/xerces-c/src/xercesc/util/XMLString.cpp:621:25 16*4882a593Smuzhiyun4 0xbe8f4ad in xercesc_4_0::InMemMsgLoader::loadMsg(unsigned int, char16_t*, unsigned int, char const*, char const*, char const*, char const*, xercesc_4_0::MemoryManager*) gdal/xerces-c/src/xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.cpp:157:16 17*4882a593Smuzhiyun5 0xbc20175 in xercesc_4_0::XMLException::loadExceptText(xercesc_4_0::XMLExcepts::Codes, char const*, char const*, char const*, char const*) gdal/xerces-c/src/xercesc/util/XMLException.cpp:241:23 18*4882a593Smuzhiyun6 0xbc48bee in xercesc_4_0::UTFDataFormatException::UTFDataFormatException(char const*, unsigned long long, xercesc_4_0::XMLExcepts::Codes, char const*, char const*, char const*, char const*, xercesc_4_0::MemoryManager*) gdal/xerces-c/src/xercesc/util/UTFDataFormatException.hpp:31:1 19*4882a593Smuzhiyun7 0xbc4824e in xercesc_4_0::XMLUTF8Transcoder::transcodeFrom(unsigned char const*, unsigned int, char16_t*, unsigned int, unsigned int&, unsigned char*) gdal/xerces-c/src/xercesc/util/XMLUTF8Transcoder.cpp:182:13 20*4882a593Smuzhiyun8 0xbd27d7e in xercesc_4_0::XMLReader::xcodeMoreChars(char16_t*, unsigned char*, unsigned int) gdal/xerces-c/src/xercesc/internal/XMLReader.cpp:1926:34 21*4882a593Smuzhiyun9 0xbd271dd in xercesc_4_0::XMLReader::refreshCharBuffer() gdal/xerces-c/src/xercesc/internal/XMLReader.cpp:571:19 22*4882a593Smuzhiyun10 0xbd15c63 in xercesc_4_0::XMLReader::peekNextChar(char16_t&) gdal/xerces-c/src/xercesc/internal/XMLReader.hpp:767:14 23*4882a593Smuzhiyun11 0xbd15aaf in xercesc_4_0::ReaderMgr::peekNextChar() gdal/xerces-c/src/xercesc/internal/ReaderMgr.cpp:158:21 24*4882a593Smuzhiyun12 0xbd328da in xercesc_4_0::XMLScanner::scanProlog() gdal/xerces-c/src/xercesc/internal/XMLScanner.cpp:1241:45 25*4882a593Smuzhiyun13 0xbd31ef4 in xercesc_4_0::XMLScanner::scanFirst(xercesc_4_0::InputSource const&, xercesc_4_0::XMLPScanToken&) gdal/xerces-c/src/xercesc/internal/XMLScanner.cpp:549:9 26*4882a593Smuzhiyun14 0xbdadcff in xercesc_4_0::SAX2XMLReaderImpl::parseFirst(xercesc_4_0::InputSource const&, xercesc_4_0::XMLPScanToken&) gdal/xerces-c/src/xercesc/parsers/SAX2XMLReaderImpl.cpp:500:22 27*4882a593Smuzhiyun``` 28*4882a593SmuzhiyunUpstream: https://github.com/apache/xerces-c/commit/1bdf6d8ba878c1fe1d779824be70001fc0bebd2c 29*4882a593Smuzhiyun 30*4882a593SmuzhiyunSigned-off-by: Matthew Weber <matthew.weber@rockwellcollins.com> 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun--- 33*4882a593Smuzhiyun .../MsgLoaders/InMemory/InMemMsgLoader.cpp | 31 ++++++++++++++----- 34*4882a593Smuzhiyun 1 file changed, 23 insertions(+), 8 deletions(-) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyundiff --git a/src/xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.cpp b/src/xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.cpp 37*4882a593Smuzhiyunindex cda103226..6971fde96 100644 38*4882a593Smuzhiyun--- a/src/xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.cpp 39*4882a593Smuzhiyun+++ b/src/xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.cpp 40*4882a593Smuzhiyun@@ -25,6 +25,7 @@ 41*4882a593Smuzhiyun // --------------------------------------------------------------------------- 42*4882a593Smuzhiyun #include <xercesc/util/BitOps.hpp> 43*4882a593Smuzhiyun #include <xercesc/util/PlatformUtils.hpp> 44*4882a593Smuzhiyun+#include <xercesc/util/TranscodingException.hpp> 45*4882a593Smuzhiyun #include <xercesc/util/XMLMsgLoader.hpp> 46*4882a593Smuzhiyun #include <xercesc/util/XMLString.hpp> 47*4882a593Smuzhiyun #include <xercesc/util/XMLUni.hpp> 48*4882a593Smuzhiyun@@ -153,14 +154,28 @@ bool InMemMsgLoader::loadMsg(const XMLMsgLoader::XMLMsgId msgToLoad 49*4882a593Smuzhiyun XMLCh* tmp4 = 0; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun bool bRet = false; 52*4882a593Smuzhiyun- if (repText1) 53*4882a593Smuzhiyun- tmp1 = XMLString::transcode(repText1, manager); 54*4882a593Smuzhiyun- if (repText2) 55*4882a593Smuzhiyun- tmp2 = XMLString::transcode(repText2, manager); 56*4882a593Smuzhiyun- if (repText3) 57*4882a593Smuzhiyun- tmp3 = XMLString::transcode(repText3, manager); 58*4882a593Smuzhiyun- if (repText4) 59*4882a593Smuzhiyun- tmp4 = XMLString::transcode(repText4, manager); 60*4882a593Smuzhiyun+ try 61*4882a593Smuzhiyun+ { 62*4882a593Smuzhiyun+ if (repText1) 63*4882a593Smuzhiyun+ tmp1 = XMLString::transcode(repText1, manager); 64*4882a593Smuzhiyun+ if (repText2) 65*4882a593Smuzhiyun+ tmp2 = XMLString::transcode(repText2, manager); 66*4882a593Smuzhiyun+ if (repText3) 67*4882a593Smuzhiyun+ tmp3 = XMLString::transcode(repText3, manager); 68*4882a593Smuzhiyun+ if (repText4) 69*4882a593Smuzhiyun+ tmp4 = XMLString::transcode(repText4, manager); 70*4882a593Smuzhiyun+ } 71*4882a593Smuzhiyun+ catch( const TranscodingException& ) 72*4882a593Smuzhiyun+ { 73*4882a593Smuzhiyun+ if (tmp1) 74*4882a593Smuzhiyun+ manager->deallocate(tmp1); 75*4882a593Smuzhiyun+ if (tmp2) 76*4882a593Smuzhiyun+ manager->deallocate(tmp2); 77*4882a593Smuzhiyun+ if (tmp3) 78*4882a593Smuzhiyun+ manager->deallocate(tmp3); 79*4882a593Smuzhiyun+ // Note: tmp4 cannot leak 80*4882a593Smuzhiyun+ throw; 81*4882a593Smuzhiyun+ } 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun bRet = loadMsg(msgToLoad, toFill, maxChars, tmp1, tmp2, tmp3, tmp4, manager); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun-- 86*4882a593Smuzhiyun2.17.1 87*4882a593Smuzhiyun 88