You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2004/09/30 15:14:28 UTC
cvs commit: xml-xerces/c/src/xercesc/validators/schema GeneralAttributeCheck.cpp SchemaValidator.cpp TraverseSchema.cpp
amassari 2004/09/30 06:14:28
Modified: c/src/xercesc/validators/DTD DTDScanner.cpp
c/src/xercesc/validators/schema GeneralAttributeCheck.cpp
SchemaValidator.cpp TraverseSchema.cpp
Log:
Fix jira#1280 - Borland leaks memory if break or continue are used inside a catch block
Revision Changes Path
1.35 +139 -133 xml-xerces/c/src/xercesc/validators/DTD/DTDScanner.cpp
Index: DTDScanner.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/DTD/DTDScanner.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- DTDScanner.cpp 8 Sep 2004 13:56:50 -0000 1.34
+++ DTDScanner.cpp 30 Sep 2004 13:14:27 -0000 1.35
@@ -16,6 +16,9 @@
/*
* $Log$
+ * Revision 1.35 2004/09/30 13:14:27 amassari
+ * Fix jira#1280 - Borland leaks memory if break or continue are used inside a catch block
+ *
* Revision 1.34 2004/09/08 13:56:50 peiyongz
* Apache License Version 2.0
*
@@ -2656,168 +2659,171 @@
bool inCharData = false;
while (true)
{
- try
- {
- while (true)
+ bool bDoBreak=false; // workaround for Borland bug with 'break' in 'catch'
+ try
{
- const XMLCh nextCh = fReaderMgr->peekNextChar();
-
- if (nextCh == chOpenAngle)
+ while (true)
{
- // Get the reader we started this on
- // XML 1.0 P28a Well-formedness constraint: PE Between Declarations
- const unsigned int orgReader = fReaderMgr->getCurrentReaderNum();
- bool wasInPE = (fReaderMgr->getCurrentReader()->getType() == XMLReader::Type_PE);
+ const XMLCh nextCh = fReaderMgr->peekNextChar();
- //
- // Now scan the markup. Set the flag so that we will know that
- // we were in markup if an end of entity exception occurs.
- //
- fReaderMgr->getNextChar();
- inMarkup = true;
- scanMarkupDecl(bAcceptDecl);
- inMarkup = false;
+ if (nextCh == chOpenAngle)
+ {
+ // Get the reader we started this on
+ // XML 1.0 P28a Well-formedness constraint: PE Between Declarations
+ const unsigned int orgReader = fReaderMgr->getCurrentReaderNum();
+ bool wasInPE = (fReaderMgr->getCurrentReader()->getType() == XMLReader::Type_PE);
- //
- // And see if we got back to the same level. If not, then its
- // a partial markup error.
- //
- if (fReaderMgr->getCurrentReaderNum() != orgReader){
- if (wasInPE)
- fScanner->emitError(XMLErrs::PEBetweenDecl);
- else if (fScanner->getDoValidation())
- fScanner->getValidator()->emitError(XMLValid::PartialMarkupInPE);
- }
+ //
+ // Now scan the markup. Set the flag so that we will know that
+ // we were in markup if an end of entity exception occurs.
+ //
+ fReaderMgr->getNextChar();
+ inMarkup = true;
+ scanMarkupDecl(bAcceptDecl);
+ inMarkup = false;
- }
- else if (fReaderMgr->getCurrentReader()->isWhitespace(nextCh))
- {
- //
- // If we have a doc type handler, and advanced callbacks are
- // enabled, then gather up whitespace and call back. Otherwise
- // just skip whitespaces.
- //
- if (fDocTypeHandler)
- {
- inCharData = true;
- fReaderMgr->getSpaces(bbSpace.getBuffer());
- inCharData = false;
+ //
+ // And see if we got back to the same level. If not, then its
+ // a partial markup error.
+ //
+ if (fReaderMgr->getCurrentReaderNum() != orgReader){
+ if (wasInPE)
+ fScanner->emitError(XMLErrs::PEBetweenDecl);
+ else if (fScanner->getDoValidation())
+ fScanner->getValidator()->emitError(XMLValid::PartialMarkupInPE);
+ }
- fDocTypeHandler->doctypeWhitespace
- (
- bbSpace.getRawBuffer()
- , bbSpace.getLen()
- );
}
- else
+ else if (fReaderMgr->getCurrentReader()->isWhitespace(nextCh))
{
//
- // If we hit an end of entity in the middle of white
- // space, that's fine. We'll just come back in here
- // again on the next round and skip some more.
+ // If we have a doc type handler, and advanced callbacks are
+ // enabled, then gather up whitespace and call back. Otherwise
+ // just skip whitespaces.
//
- fReaderMgr->skipPastSpaces();
+ if (fDocTypeHandler)
+ {
+ inCharData = true;
+ fReaderMgr->getSpaces(bbSpace.getBuffer());
+ inCharData = false;
+
+ fDocTypeHandler->doctypeWhitespace
+ (
+ bbSpace.getRawBuffer()
+ , bbSpace.getLen()
+ );
+ }
+ else
+ {
+ //
+ // If we hit an end of entity in the middle of white
+ // space, that's fine. We'll just come back in here
+ // again on the next round and skip some more.
+ //
+ fReaderMgr->skipPastSpaces();
+ }
}
- }
- else if (nextCh == chPercent)
- {
- //
- // Expand (and scan if external) the reference value. Tell
- // it to throw an end of entity exception at the end of the
- // entity.
- //
- fReaderMgr->getNextChar();
- expandPERef(true, false, false, true);
- }
- else if (inIncludeSect && (nextCh == chCloseSquare))
- {
- //
- // Its the end of a conditional include section. So scan it and
- // decrement the include depth counter.
- //
- fReaderMgr->getNextChar();
- if (!fReaderMgr->skippedChar(chCloseSquare))
+ else if (nextCh == chPercent)
{
- fScanner->emitError(XMLErrs::ExpectedEndOfConditional);
- fReaderMgr->skipPastChar(chCloseAngle);
+ //
+ // Expand (and scan if external) the reference value. Tell
+ // it to throw an end of entity exception at the end of the
+ // entity.
+ //
+ fReaderMgr->getNextChar();
+ expandPERef(true, false, false, true);
}
- else if (!fReaderMgr->skippedChar(chCloseAngle))
+ else if (inIncludeSect && (nextCh == chCloseSquare))
{
- fScanner->emitError(XMLErrs::ExpectedEndOfConditional);
- fReaderMgr->skipPastChar(chCloseAngle);
+ //
+ // Its the end of a conditional include section. So scan it and
+ // decrement the include depth counter.
+ //
+ fReaderMgr->getNextChar();
+ if (!fReaderMgr->skippedChar(chCloseSquare))
+ {
+ fScanner->emitError(XMLErrs::ExpectedEndOfConditional);
+ fReaderMgr->skipPastChar(chCloseAngle);
+ }
+ else if (!fReaderMgr->skippedChar(chCloseAngle))
+ {
+ fScanner->emitError(XMLErrs::ExpectedEndOfConditional);
+ fReaderMgr->skipPastChar(chCloseAngle);
+ }
+ return;
}
- return;
- }
- else if (!nextCh)
- {
- return; // nothing left
- }
- else
- {
- fReaderMgr->getNextChar();
- if (!fReaderMgr->getCurrentReader()->isXMLChar(nextCh))
+ else if (!nextCh)
{
- XMLCh tmpBuf[9];
- XMLString::binToText
- (
- nextCh
- , tmpBuf
- , 8
- , 16
- , fMemoryManager
- );
- fScanner->emitError(XMLErrs::InvalidCharacter, tmpBuf);
+ return; // nothing left
}
else
{
- fScanner->emitError(XMLErrs::InvalidDocumentStructure);
- }
+ fReaderMgr->getNextChar();
+ if (!fReaderMgr->getCurrentReader()->isXMLChar(nextCh))
+ {
+ XMLCh tmpBuf[9];
+ XMLString::binToText
+ (
+ nextCh
+ , tmpBuf
+ , 8
+ , 16
+ , fMemoryManager
+ );
+ fScanner->emitError(XMLErrs::InvalidCharacter, tmpBuf);
+ }
+ else
+ {
+ fScanner->emitError(XMLErrs::InvalidDocumentStructure);
+ }
- // Try to get realigned
- static const XMLCh toSkip[] =
- {
- chPercent, chCloseSquare, chOpenAngle, chNull
- };
- fReaderMgr->skipUntilInOrWS(toSkip);
+ // Try to get realigned
+ static const XMLCh toSkip[] =
+ {
+ chPercent, chCloseSquare, chOpenAngle, chNull
+ };
+ fReaderMgr->skipUntilInOrWS(toSkip);
+ }
+ bAcceptDecl = false;
}
- bAcceptDecl = false;
}
- }
- catch(const EndOfEntityException& toCatch)
- {
- //
- // If the external entity ended while we were in markup, then that's
- // a partial markup error.
- //
- if (inMarkup)
+ catch(const EndOfEntityException& toCatch)
{
- fScanner->emitError(XMLErrs::PartialMarkupInEntity);
- inMarkup = false;
- }
+ //
+ // If the external entity ended while we were in markup, then that's
+ // a partial markup error.
+ //
+ if (inMarkup)
+ {
+ fScanner->emitError(XMLErrs::PartialMarkupInEntity);
+ inMarkup = false;
+ }
- // If we were in char data, then send what we got
- if (inCharData)
- {
- // Send what we got, then rethrow
- if (fDocTypeHandler)
+ // If we were in char data, then send what we got
+ if (inCharData)
{
- fDocTypeHandler->doctypeWhitespace
- (
- bbSpace.getRawBuffer()
- , bbSpace.getLen()
- );
+ // Send what we got, then rethrow
+ if (fDocTypeHandler)
+ {
+ fDocTypeHandler->doctypeWhitespace
+ (
+ bbSpace.getRawBuffer()
+ , bbSpace.getLen()
+ );
+ }
+ inCharData = false;
}
- inCharData = false;
- }
- //
- // If the entity that just ended was the entity that we started
- // on, then this is the end of the external subset.
- //
- if (orgReader == toCatch.getReaderNum())
+ //
+ // If the entity that just ended was the entity that we started
+ // on, then this is the end of the external subset.
+ //
+ if (orgReader == toCatch.getReaderNum())
+ bDoBreak=true;
+ }
+ if(bDoBreak)
break;
- }
}
// If we have a doc type handler, tell it the ext subset ends
1.24 +8 -1 xml-xerces/c/src/xercesc/validators/schema/GeneralAttributeCheck.cpp
Index: GeneralAttributeCheck.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/GeneralAttributeCheck.cpp,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- GeneralAttributeCheck.cpp 29 Sep 2004 20:58:10 -0000 1.23
+++ GeneralAttributeCheck.cpp 30 Sep 2004 13:14:28 -0000 1.24
@@ -16,6 +16,9 @@
/*
* $Log$
+ * Revision 1.24 2004/09/30 13:14:28 amassari
+ * Fix jira#1280 - Borland leaks memory if break or continue are used inside a catch block
+ *
* Revision 1.23 2004/09/29 20:58:10 knoaman
* [Bug 1209] Problem with id usage across schema
* http://issues.apache.org/jira/browse/XERCESC-1209
@@ -420,6 +423,7 @@
int attNameId = A_Invalid;
attName = attribute->getLocalName();
+ bool bContinue=false; // workaround for Borland bug with 'continue' in 'catch'
try {
attNameId= fAttMap->get(attName, fMemoryManager);
}
@@ -431,8 +435,10 @@
schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
XMLErrs::AttributeDisallowed, attName, contextStr, elemName);
- continue;
+ bContinue=true;
}
+ if(bContinue)
+ continue;
if (fgElemAttTable[elemContext][attNameId] & Att_Mask) {
1.58 +7 -1 xml-xerces/c/src/xercesc/validators/schema/SchemaValidator.cpp
Index: SchemaValidator.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/SchemaValidator.cpp,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -r1.57 -r1.58
--- SchemaValidator.cpp 27 Sep 2004 20:13:59 -0000 1.57
+++ SchemaValidator.cpp 30 Sep 2004 13:14:28 -0000 1.58
@@ -16,6 +16,9 @@
/*
* $Log$
+ * Revision 1.58 2004/09/30 13:14:28 amassari
+ * Fix jira#1280 - Borland leaks memory if break or continue are used inside a catch block
+ *
* Revision 1.57 2004/09/27 20:13:59 knoaman
* Reset datatype validator.
*
@@ -1899,6 +1902,7 @@
ContentSpecNode* baseNode = baseNodes->elementAt(j);
current++;
+ bool bDoBreak=false; // workaround for Borland bug with 'break' in 'catch'
try {
checkParticleDerivationOk(currentGrammar, derivedNodes->elementAt(i),
@@ -1908,9 +1912,11 @@
}
catch(const XMLException&) {
if (!toLax && baseNode->getMinTotalRange()) {
- break;
+ bDoBreak=true;
}
}
+ if(bDoBreak)
+ break;
}
// did not find a match
1.122 +9 -3 xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp
Index: TraverseSchema.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -r1.121 -r1.122
--- TraverseSchema.cpp 30 Sep 2004 11:00:07 -0000 1.121
+++ TraverseSchema.cpp 30 Sep 2004 13:14:28 -0000 1.122
@@ -3058,6 +3058,7 @@
const XMLCh* facetName = content->getLocalName();
+ bool bContinue=false; // workaround for Borland bug with 'continue' in 'catch'
try {
scope = fAttributeCheck.getFacetId(facetName, fMemoryManager);
}
@@ -3069,8 +3070,10 @@
reportSchemaError(content, XMLUni::fgXMLErrDomain, XMLErrs::InvalidFacetName, facetName);
content = XUtil::getNextSiblingElement(content);
- continue;
+ bContinue=true;
}
+ if(bContinue)
+ continue;
// REVISIT
// check for annotation content - we are not checking whether the
@@ -3608,6 +3611,7 @@
const XMLCh* facetName = content->getLocalName();
+ bool bDoBreak=false; // workaround for Borland bug with 'break' in 'catch'
// if not a valid facet, break from the loop
try {
scope = fAttributeCheck.getFacetId(facetName, fMemoryManager);
@@ -3617,8 +3621,10 @@
throw;
}
catch(...) {
- break;
+ bDoBreak=true;
}
+ if(bDoBreak)
+ break;
if (content->getNodeType() == DOMNode::ELEMENT_NODE) {
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org