ComplexTypeInfo::convertContentSpecTree(): fix memory leaks when a OutOfMemoryException occurs
diff --git a/src/xercesc/validators/schema/ComplexTypeInfo.cpp b/src/xercesc/validators/schema/ComplexTypeInfo.cpp
index d2a7b9b..b0cf419 100644
--- a/src/xercesc/validators/schema/ComplexTypeInfo.cpp
+++ b/src/xercesc/validators/schema/ComplexTypeInfo.cpp
@@ -526,12 +526,31 @@
|| ((curType & 0x0f) == ContentSpecNode::Sequence))
{
ContentSpecNode* childNode = curNode->getFirst();
- ContentSpecNode* leftNode = convertContentSpecTree(childNode, checkUPA, bAllowCompactSyntax);
+ ContentSpecNode* leftNode;
+ try
+ {
+ leftNode = convertContentSpecTree(childNode, checkUPA, bAllowCompactSyntax);
+ }
+ catch( const OutOfMemoryException& )
+ {
+ curNode->setAdoptFirst(false);
+ delete curNode;
+ throw;
+ }
ContentSpecNode* rightNode = curNode->getSecond();
if (!rightNode) {
- retNode = expandContentModel(leftNode, minOccurs, maxOccurs, bAllowCompactSyntax);
+ try
+ {
+ retNode = expandContentModel(leftNode, minOccurs, maxOccurs, bAllowCompactSyntax);
+ }
+ catch( const OutOfMemoryException& )
+ {
+ curNode->setAdoptFirst(false);
+ delete curNode;
+ throw;
+ }
curNode->setAdoptFirst(false);
delete curNode;
return retNode;
@@ -545,7 +564,16 @@
}
childNode = rightNode;
- rightNode = convertContentSpecTree(childNode, checkUPA, bAllowCompactSyntax);
+ try
+ {
+ rightNode = convertContentSpecTree(childNode, checkUPA, bAllowCompactSyntax);
+ }
+ catch( const OutOfMemoryException& )
+ {
+ curNode->setAdoptSecond(false);
+ delete curNode;
+ throw;
+ }
if (rightNode != childNode) {