From 01af96b405c110bb2d7ecb14d605e49e6fb5f0dc Mon Sep 17 00:00:00 2001 From: Tinny Ng <tng@apache.org> Date: Thu, 28 Feb 2002 21:55:57 +0000 Subject: [PATCH] Should check if XMLReader is created successfully. git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@173549 13f79535-47bb-0310-9956-ffa450edef68 --- src/xercesc/internal/ReaderMgr.cpp | 60 +++++++++++++++++++----------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/src/xercesc/internal/ReaderMgr.cpp b/src/xercesc/internal/ReaderMgr.cpp index 99ea3d193..02906a171 100644 --- a/src/xercesc/internal/ReaderMgr.cpp +++ b/src/xercesc/internal/ReaderMgr.cpp @@ -1,37 +1,37 @@ /* * The Apache Software License, Version 1.1 - * + * * Copyright (c) 1999-2000 The Apache Software Foundation. All rights * reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: - * + * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * + * notice, this list of conditions and the following disclaimer. + * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. - * + * * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: + * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. - * + * * 4. The names "Xerces" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this - * software without prior written permission. For written + * software without prior written permission. For written * permission, please contact apache\@apache.org. - * + * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. - * + * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -45,7 +45,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== - * + * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation, and was * originally based on software copyright (c) 1999, International @@ -427,10 +427,10 @@ XMLReader* ReaderMgr::createReader( const InputSource& src // XMLReader* retVal = 0; - // XMLReader ctor invokes refreshRawBuffer() which calls + // XMLReader ctor invokes refreshRawBuffer() which calls // newStream->readBytes(). - // This readBytes() may throw exception, which neither - // refresRawBuffer(), nor XMLReader ctor catches. + // This readBytes() may throw exception, which neither + // refresRawBuffer(), nor XMLReader ctor catches. // We need to handle this exception to avoid leak on newStream. try { @@ -467,6 +467,12 @@ XMLReader* ReaderMgr::createReader( const InputSource& src throw; } + // If it failed for any reason, then return zero. + if (!retVal) { + delete newStream; + return 0; + } + // Set the next available reader number on this reader retVal->setReaderNum(fNextReaderNum++); return retVal; @@ -588,23 +594,33 @@ ReaderMgr::createIntEntReader( const XMLCh* const sysId // as a 'do nothing' transcoder for the already internalized XMLCh // data that makes up an internal entity. // + BinMemInputStream* newStream = new BinMemInputStream + ( + (const XMLByte*)dataBuf + , dataLen * sizeof(XMLCh) + , copyBuf ? BinMemInputStream::BufOpt_Copy + : BinMemInputStream::BufOpt_Reference + ); + if (!newStream) + return 0; + XMLReader* retVal = new XMLReader ( sysId , 0 - , new BinMemInputStream - ( - (const XMLByte*)dataBuf - , dataLen * sizeof(XMLCh) - , copyBuf ? BinMemInputStream::BufOpt_Copy - : BinMemInputStream::BufOpt_Reference - ) + , newStream , XMLUni::fgXMLChEncodingString , refFrom , type , XMLReader::Source_Internal ); + // If it failed for any reason, then return zero. + if (!retVal) { + delete newStream; + return 0; + } + // Set the reader number to the next available number retVal->setReaderNum(fNextReaderNum++); return retVal; -- GitLab