You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ca...@apache.org on 2006/07/06 21:31:02 UTC

svn commit: r419674 - in /xerces/c/branches/xerces-2.7/src/xercesc: framework/ framework/psvi/ internal/ util/ util/regx/ validators/common/ validators/schema/

Author: cargilld
Date: Thu Jul  6 12:31:01 2006
New Revision: 419674

URL: http://svn.apache.org/viewvc?rev=419674&view=rev
Log:
Fix crashes that can occur when a non-default memory manager tries to clean up after running out of memory

Modified:
    xerces/c/branches/xerces-2.7/src/xercesc/framework/XMLAttr.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/PSVIAttributeList.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLGrammarPoolImpl.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLReader.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLScanner.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/util/KVStringPair.hpp
    xerces/c/branches/xerces-2.7/src/xercesc/util/NameIdPool.c
    xerces/c/branches/xerces-2.7/src/xercesc/util/QName.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash2KeysTableOf.c
    xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash3KeysIdPool.c
    xerces/c/branches/xerces-2.7/src/xercesc/util/ValueHashTableOf.c
    xerces/c/branches/xerces-2.7/src/xercesc/util/regx/StringToken.hpp
    xerces/c/branches/xerces-2.7/src/xercesc/validators/common/GrammarResolver.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/SchemaInfo.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/TraverseSchema.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.cpp

Modified: xerces/c/branches/xerces-2.7/src/xercesc/framework/XMLAttr.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/framework/XMLAttr.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/framework/XMLAttr.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/framework/XMLAttr.cpp Thu Jul  6 12:31:01 2006
@@ -157,6 +157,7 @@
     if (!fValueBufSz || (newLen > fValueBufSz))
     {
         fMemoryManager->deallocate(fValue); //delete [] fValue;
+        fValue = 0;
         fValueBufSz = newLen + 8;
         fValue = (XMLCh*) fMemoryManager->allocate((fValueBufSz+1) * sizeof(XMLCh)); //new XMLCh[fValueBufSz + 1];
     }

Modified: xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/PSVIAttributeList.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/PSVIAttributeList.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/PSVIAttributeList.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/PSVIAttributeList.cpp Thu Jul  6 12:31:01 2006
@@ -26,6 +26,9 @@
 
 PSVIAttributeList::PSVIAttributeList( MemoryManager* const manager ):  
         fMemoryManager(manager)
+        , fAttrList(0)
+        , fAttrNameList(0)
+        , fAttrNSList(0)
         , fAttrPos(0)
 {
     fAttrList= new (fMemoryManager) RefVectorOf<PSVIAttribute> (10, true, fMemoryManager);

Modified: xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLGrammarPoolImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLGrammarPoolImpl.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLGrammarPoolImpl.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLGrammarPoolImpl.cpp Thu Jul  6 12:31:01 2006
@@ -38,6 +38,7 @@
 void XMLGrammarPoolImpl::createXSModel()
 {
     delete fXSModel;
+    fXSModel = 0;
     fXSModel = new (getMemoryManager()) XSModel(this, getMemoryManager());
     fXSModelIsValid = true; 
 }

Modified: xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLReader.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLReader.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLReader.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLReader.cpp Thu Jul  6 12:31:01 2006
@@ -1260,10 +1260,12 @@
 
         if (fEncoding == XMLRecognizer::UTF_16L) {
             fMemoryManager->deallocate(fEncodingStr);
+            fEncodingStr = 0;
             fEncodingStr = XMLString::replicate(XMLUni::fgUTF16LEncodingString, fMemoryManager);
         }
         else {
             fMemoryManager->deallocate(fEncodingStr);
+            fEncodingStr = 0;
             fEncodingStr = XMLString::replicate(XMLUni::fgUTF16BEncodingString, fMemoryManager);
         }
     }
@@ -1285,11 +1287,13 @@
         if (fEncoding == XMLRecognizer::UCS_4L) {
 
             fMemoryManager->deallocate(fEncodingStr);
+            fEncodingStr = 0;
             fEncodingStr = XMLString::replicate(XMLUni::fgUCS4LEncodingString, fMemoryManager);
         }
         else {
 
             fMemoryManager->deallocate(fEncodingStr);
+            fEncodingStr = 0;
             fEncodingStr = XMLString::replicate(XMLUni::fgUCS4BEncodingString, fMemoryManager);
         }
     }

Modified: xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLScanner.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLScanner.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLScanner.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/internal/XMLScanner.cpp Thu Jul  6 12:31:01 2006
@@ -772,9 +772,9 @@
 
     // create initial, 64-element, fUIntPool
     fUIntPool = (unsigned int **)fMemoryManager->allocate(sizeof(unsigned int *) *fUIntPoolRowTotal);
+    memset(fUIntPool, 0, sizeof(unsigned int *) * fUIntPoolRowTotal);
     fUIntPool[0] = (unsigned int *)fMemoryManager->allocate(sizeof(unsigned int) << 6);
-    memset(fUIntPool[0], 0, sizeof(unsigned int) << 6);
-    fUIntPool[1] = 0;
+    memset(fUIntPool[0], 0, sizeof(unsigned int) << 6);    
 
     // Register self as handler for XMLBufferFull events on the CDATA buffer
     fCDataBuf.setFullHandler(this, fBufferSize);
@@ -794,11 +794,14 @@
     fMemoryManager->deallocate(fExternalSchemaLocation);//delete [] fExternalSchemaLocation;
     fMemoryManager->deallocate(fExternalNoNamespaceSchemaLocation);//delete [] fExternalNoNamespaceSchemaLocation;
     // delete fUIntPool
-    for (unsigned int i=0; i<=fUIntPoolRow; i++)
-    {
-        fMemoryManager->deallocate(fUIntPool[i]);
+    if (fUIntPool)
+    {    
+        for (unsigned int i=0; i<=fUIntPoolRow; i++)
+        {
+            fMemoryManager->deallocate(fUIntPool[i]);
+        }
+        fMemoryManager->deallocate(fUIntPool);
     }
-    fMemoryManager->deallocate(fUIntPool);
 }
 
 void XMLScanner::initValidator(XMLValidator* theValidator) {

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/KVStringPair.hpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/KVStringPair.hpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/KVStringPair.hpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/KVStringPair.hpp Thu Jul  6 12:31:01 2006
@@ -178,6 +178,7 @@
     if (newKeyLength >= fKeyAllocSize)
     {
         fMemoryManager->deallocate(fKey); //delete [] fKey;
+        fKey = 0;
         fKeyAllocSize = newKeyLength + 1;
         fKey = (XMLCh*) fMemoryManager->allocate(fKeyAllocSize * sizeof(XMLCh)); //new XMLCh[fKeyAllocSize];
     }
@@ -191,6 +192,7 @@
     if (newValueLength >= fValueAllocSize)
     {
         fMemoryManager->deallocate(fValue); //delete [] fValue;
+        fValue = 0;
         fValueAllocSize = newValueLength + 1;
         fValue = (XMLCh*) fMemoryManager->allocate(fValueAllocSize * sizeof(XMLCh)); //new XMLCh[fValueAllocSize];
     }

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/NameIdPool.c
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/NameIdPool.c?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/NameIdPool.c (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/NameIdPool.c Thu Jul  6 12:31:01 2006
@@ -73,8 +73,7 @@
     (
         fHashModulus * sizeof(NameIdPoolBucketElem<TElem>*)
     ); //new NameIdPoolBucketElem<TElem>*[fHashModulus];
-    for (unsigned int index = 0; index < fHashModulus; index++)
-        fBucketList[index] = 0;
+    memset(fBucketList, 0, sizeof(fBucketList[0]) * fHashModulus);
 
     //
     //  Allocate the initial id pointers array. We don't have to zero them

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/QName.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/QName.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/QName.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/QName.cpp Thu Jul  6 12:31:01 2006
@@ -180,6 +180,7 @@
             {
                 fMemoryManager->deallocate(fRawName); //delete [] fRawName;
 
+                ((QName*)this)->fRawName = 0;
                 // We have to cast off the const'ness to do this
                 ((QName*)this)->fRawNameBufSz = neededLen;
                 ((QName*)this)->fRawName = (XMLCh*) fMemoryManager->allocate
@@ -234,7 +235,8 @@
             if (!fRawName || (neededLen > fRawNameBufSz))
             {
                 fMemoryManager->deallocate(fRawName); //delete [] fRawName;
-
+                
+                fRawName = 0;
                 // We have to cast off the const'ness to do this
                 ((QName*)this)->fRawNameBufSz = neededLen;
                 ((QName*)this)->fRawName = (XMLCh*) fMemoryManager->allocate
@@ -292,6 +294,7 @@
         if (!fRawNameBufSz || (newLen > fRawNameBufSz))
         {
             fMemoryManager->deallocate(fRawName); //delete [] fRawName;
+            fRawName = 0;
             fRawNameBufSz = newLen + 8;
             fRawName = (XMLCh*) fMemoryManager->allocate
             (
@@ -325,6 +328,7 @@
     if (!fPrefixBufSz || (newLen > fPrefixBufSz))
     {
         fMemoryManager->deallocate(fPrefix); //delete [] fPrefix;
+        fPrefix = 0;
         fPrefixBufSz = newLen + 8;
         fPrefix = (XMLCh*) fMemoryManager->allocate
         (
@@ -339,6 +343,7 @@
     if (!fPrefixBufSz || (newLen > fPrefixBufSz))
     {
         fMemoryManager->deallocate(fPrefix); //delete [] fPrefix;
+        fPrefix = 0;
         fPrefixBufSz = newLen + 8;
         fPrefix = (XMLCh*) fMemoryManager->allocate
         (
@@ -357,6 +362,7 @@
     if (!fLocalPartBufSz || (newLen > fLocalPartBufSz))
     {
         fMemoryManager->deallocate(fLocalPart); //delete [] fLocalPart;
+        fLocalPart = 0;
         fLocalPartBufSz = newLen + 8;
         fLocalPart = (XMLCh*) fMemoryManager->allocate
         (
@@ -371,6 +377,7 @@
     if (!fLocalPartBufSz || (newLen > fLocalPartBufSz))
     {
         fMemoryManager->deallocate(fLocalPart); //delete [] fLocalPart;
+        fLocalPart = 0;
         fLocalPartBufSz = newLen + 8;
         fLocalPart = (XMLCh*) fMemoryManager->allocate
         (

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash2KeysTableOf.c
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash2KeysTableOf.c?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash2KeysTableOf.c (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash2KeysTableOf.c Thu Jul  6 12:31:01 2006
@@ -97,8 +97,7 @@
     (
         fHashModulus * sizeof(RefHash2KeysTableBucketElem<TVal>*)
     ); //new RefHash2KeysTableBucketElem<TVal>*[fHashModulus];
-    for (unsigned int index = 0; index < fHashModulus; index++)
-        fBucketList[index] = 0;
+    memset(fBucketList, 0, sizeof(fBucketList[0]) * fHashModulus);
 }
 
 template <class TVal> RefHash2KeysTableOf<TVal>::~RefHash2KeysTableOf()

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash3KeysIdPool.c
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash3KeysIdPool.c?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash3KeysIdPool.c (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/RefHash3KeysIdPool.c Thu Jul  6 12:31:01 2006
@@ -142,8 +142,7 @@
     (
         fHashModulus * sizeof(RefHash3KeysTableBucketElem<TVal>*)
     ); //new RefHash3KeysTableBucketElem<TVal>*[fHashModulus];
-    for (unsigned int index = 0; index < fHashModulus; index++)
-        fBucketList[index] = 0;
+    memset(fBucketList, 0, sizeof(fBucketList[0]) * fHashModulus);
 }
 
 template <class TVal> RefHash3KeysIdPool<TVal>::~RefHash3KeysIdPool()

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/ValueHashTableOf.c
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/ValueHashTableOf.c?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/ValueHashTableOf.c (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/ValueHashTableOf.c Thu Jul  6 12:31:01 2006
@@ -73,8 +73,7 @@
     (
         fHashModulus * sizeof(ValueHashTableBucketElem<TVal>*)
     ); //new ValueHashTableBucketElem<TVal>*[fHashModulus];
-    for (unsigned int index = 0; index < fHashModulus; index++)
-        fBucketList[index] = 0;
+    memset(fBucketList, 0, sizeof(fBucketList[0]) * fHashModulus);
 }
 
 template <class TVal> ValueHashTableOf<TVal>::~ValueHashTableOf()

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/regx/StringToken.hpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/regx/StringToken.hpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/regx/StringToken.hpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/regx/StringToken.hpp Thu Jul  6 12:31:01 2006
@@ -86,6 +86,7 @@
 inline void StringToken::setString(const XMLCh* const literal) {
 
 	fMemoryManager->deallocate(fString);//delete [] fString;
+    fString = 0;
 	fString = XMLString::replicate(literal, fMemoryManager);
 }
 

Modified: xerces/c/branches/xerces-2.7/src/xercesc/validators/common/GrammarResolver.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/validators/common/GrammarResolver.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/validators/common/GrammarResolver.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/validators/common/GrammarResolver.cpp Thu Jul  6 12:31:01 2006
@@ -43,6 +43,7 @@
 ,fGrammarPool(gramPool)
 ,fXSModel(0)
 ,fGrammarPoolXSModel(0)
+,fGrammarsToAddToXSModel(0)
 {
     fGrammarBucket = new (manager) RefHashTableOf<Grammar>(29, true,  manager);
 

Modified: xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/SchemaInfo.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/SchemaInfo.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/SchemaInfo.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/SchemaInfo.cpp Thu Jul  6 12:31:01 2006
@@ -65,11 +65,16 @@
     , fMemoryManager(manager)
 {
     fImportingInfoList = new (fMemoryManager) RefVectorOf<SchemaInfo>(4, false, fMemoryManager);
-    for (unsigned int i = 0; i < C_Count; i++)
-    {
-        fTopLevelComponents[i] = 0;
-        fLastTopLevelComponent[i] = 0;
-    }
+
+	memset(
+         fTopLevelComponents,
+         0,
+         sizeof(fTopLevelComponents[0]) * C_Count);    
+    memset(
+         fLastTopLevelComponent,
+         0,
+         sizeof(fLastTopLevelComponent[0]) * C_Count);    
+    
     fNonXSAttList = new (fMemoryManager) ValueVectorOf<DOMNode*>(2, fMemoryManager);
     fValidationContext = new (fMemoryManager) ValidationContextImpl(fMemoryManager);
 }
@@ -83,34 +88,18 @@
     if (fAdoptInclude)
         delete fIncludeInfoList;
 
-    delete fImportingInfoList;
-
-    fImportedInfoList = fIncludeInfoList = fImportingInfoList = 0;
-
+    delete fImportingInfoList;  
     delete fImportedNSList;
-    fImportedNSList = 0;
-
     delete fFailedRedefineList;
-    fFailedRedefineList = 0;
-
     delete fRecursingAnonTypes;
-    fRecursingAnonTypes = 0;
-
-    delete fRecursingTypeNames;
-    fRecursingTypeNames = 0;
+    delete fRecursingTypeNames;   
 
     for (unsigned int i = 0; i < C_Count; i++) {
-
         delete fTopLevelComponents[i];
-        fTopLevelComponents[i] = 0;
-        fLastTopLevelComponent[i] = 0;
     }
 
-    delete fNonXSAttList;
-    fNonXSAttList = 0;
-
-    delete fValidationContext;
-    fValidationContext = 0;
+    delete fNonXSAttList;  
+    delete fValidationContext;    
 }
 
 // ---------------------------------------------------------------------------

Modified: xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/TraverseSchema.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/TraverseSchema.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/TraverseSchema.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/TraverseSchema.cpp Thu Jul  6 12:31:01 2006
@@ -14,6 +14,10 @@
  * limitations under the License.
  */
 
+/*
+ * $Id$
+ */
+
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
@@ -584,7 +588,7 @@
     // ------------------------------------------------------------------
     fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
                         ((XSDElementNSImpl*) elem)->getLineNo(),
-                        ((XSDElementNSImpl*) elem)->getColumnNo());    
+                        ((XSDElementNSImpl*) elem)->getColumnNo());      
     InputSource* srcToFill = resolveSchemaLocation(schemaLocation,
             XMLResourceIdentifier::SchemaInclude);
     Janitor<InputSource> janSrc(srcToFill);
@@ -778,9 +782,9 @@
     // ------------------------------------------------------------------
     // Resolve schema location
     // ------------------------------------------------------------------
-	fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
+    fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
                         ((XSDElementNSImpl*) elem)->getLineNo(),
-                        ((XSDElementNSImpl*) elem)->getColumnNo());    
+                        ((XSDElementNSImpl*) elem)->getColumnNo());     
     InputSource* srcToFill = resolveSchemaLocation(schemaLocation,
             XMLResourceIdentifier::SchemaImport, nameSpace);
 
@@ -1560,10 +1564,11 @@
     Janitor<ContentSpecNode> specNode(0);
     XercesGroupInfo* saveGroupInfo = fCurrentGroupInfo;
 
-    Janitor<XercesGroupInfo>    newGroupInfo(new (fGrammarPoolMemoryManager) XercesGroupInfo(
+    Janitor<XercesGroupInfo>    newGroupInfoJan(new (fGrammarPoolMemoryManager) XercesGroupInfo(
         fStringPool->addOrFind(name), fTargetNSURI, fGrammarPoolMemoryManager));    
     fCurrentGroupStack->addElement(nameIndex);
-    fCurrentGroupInfo = newGroupInfo.get();    
+    XercesGroupInfo* const newGroupInfo = newGroupInfoJan.get();
+    fCurrentGroupInfo = newGroupInfo;    
 
     fCurrentScope = fScopeCount++;
     fCurrentGroupInfo->setScope(fCurrentScope);
@@ -1614,19 +1619,20 @@
 
     fCurrentGroupInfo->setContentSpec(specNode.release());
     fGroupRegistry->put((void*) fullName, fCurrentGroupInfo);
+    newGroupInfoJan.release();
     fCurrentGroupInfo = saveGroupInfo;
     fCurrentScope = saveScope;
 
     // Store Annotation
     if (!janAnnot.isDataNull()) {
-        fSchemaGrammar->putAnnotation(newGroupInfo.get(), janAnnot.release());        
+        fSchemaGrammar->putAnnotation(newGroupInfo, janAnnot.release());        
     }
 
     if (fFullConstraintChecking) {
 
         XSDLocator* aLocator = new (fGrammarPoolMemoryManager) XSDLocator();
 
-        newGroupInfo.get()->setLocator(aLocator);        
+        newGroupInfo->setLocator(aLocator);        
         aLocator->setValues(fStringPool->getValueForId(fStringPool->addOrFind(fSchemaInfo->getCurrentSchemaURL())),
                             0, ((XSDElementNSImpl*) elem)->getLineNo(),
                             ((XSDElementNSImpl*) elem)->getColumnNo());
@@ -1647,7 +1653,7 @@
                 XercesGroupInfo* baseGroup = fGroupRegistry->get(fBuffer.getRawBuffer());
                 if (baseGroup)
                 {
-                    newGroupInfo.get()->setBaseGroup(baseGroup);                    
+                    newGroupInfo->setBaseGroup(baseGroup);                    
                 }
                 else
                 {
@@ -1659,7 +1665,7 @@
 
                     if (groupElem != 0) {
                         baseGroup = traverseGroupDecl(groupElem);
-                        newGroupInfo.get()->setBaseGroup(baseGroup);                        
+                        newGroupInfo->setBaseGroup(baseGroup);                        
                         fSchemaInfo = saveInfo;
                     }
                     else
@@ -1672,7 +1678,7 @@
         }
     }
 
-    return newGroupInfo.release();    
+    return newGroupInfo;    
 }
 
 
@@ -1787,10 +1793,10 @@
 
         // Pop declaration
         fDeclStack->removeElementAt(fDeclStack->size() - 1);
-
-        // Restore old attGroupInfo
+       
+        fAttGroupRegistry->put((void*) fStringPool->getValueForId(fStringPool->addOrFind(name)), janAttGroupInfo.get());
+        // Restore old attGroupInfo   
         attGroupInfo = janAttGroupInfo.release();
-        fAttGroupRegistry->put((void*) fStringPool->getValueForId(fStringPool->addOrFind(name)), attGroupInfo);
         fCurrentAttGroupInfo = saveAttGroupInfo;
 
         // Check Attribute Derivation Restriction OK
@@ -1981,7 +1987,7 @@
                                          , fSchemaGrammar->getValidationContext()
                                          , fMemoryManager);
                     }
-                    catch(const XMLException& excep) {
+                    catch(const XMLException& excep) {                        
                         reportSchemaError(elem, excep);
                     }
                     uriIndex = fURIStringPool->addOrFind(tokenElem);
@@ -2022,7 +2028,8 @@
                     , fGrammarPoolMemoryManager
                 );
                 secondNode.release();
-                secondNode.reset(newNode);                
+                secondNode.reset(newNode); 
+                firstNode.release();
             }
         }
         firstNode.release();
@@ -6024,7 +6031,8 @@
                                            const bool isMixed,
                                            const bool isBaseAnyType) {
     
-    Janitor<ContentSpecNode>    specNode(0);
+    Janitor<ContentSpecNode>    specNodeJan(0);
+    ContentSpecNode* specNode = specNodeJan.get();
     const DOMElement* attrNode = 0;
     int                 typeDerivedBy = typeInfo->getDerivedBy();
     ComplexTypeInfo*    baseTypeInfo = typeInfo->getBaseComplexTypeInfo();
@@ -6071,14 +6079,14 @@
 
             if (grpInfo) {
 
-                specNode.reset(grpInfo->getContentSpec());
+                ContentSpecNode* const groupSpecNode = grpInfo->getContentSpec();
 
-                if (specNode.get()) {
+                if (groupSpecNode) {
 
-                    int contentContext = specNode.get()->hasAllContent() ? Group_Ref_With_All : Not_All_Context;
-                    ContentSpecNode* tempSpecNode = specNode.release();
-                    specNode.reset(new (fGrammarPoolMemoryManager) ContentSpecNode(*tempSpecNode));
-                    checkMinMax(specNode.get(), childElem, contentContext);
+                    int contentContext = groupSpecNode->hasAllContent() ? Group_Ref_With_All : Not_All_Context;
+                    specNodeJan.reset(new (fGrammarPoolMemoryManager) ContentSpecNode(*groupSpecNode));
+                    specNode = specNodeJan.get();
+                    checkMinMax(specNode, childElem, contentContext);
                 }
             }
 
@@ -6087,20 +6095,23 @@
         }
         else if (XMLString::equals(childName, SchemaSymbols::fgELT_SEQUENCE)) {
 
-            specNode.reset(traverseChoiceSequence(childElem, ContentSpecNode::Sequence));
-            checkMinMax(specNode.get(), childElem);
+            specNodeJan.reset(traverseChoiceSequence(childElem, ContentSpecNode::Sequence));
+            specNode = specNodeJan.get();
+            checkMinMax(specNode, childElem);
             attrNode = XUtil::getNextSiblingElement(childElem);
         }
         else if (XMLString::equals(childName, SchemaSymbols::fgELT_CHOICE)) {
 
-            specNode.reset(traverseChoiceSequence(childElem, ContentSpecNode::Choice));
-            checkMinMax(specNode.get(), childElem);
+            specNodeJan.reset(traverseChoiceSequence(childElem, ContentSpecNode::Choice));
+            specNode = specNodeJan.get();
+            checkMinMax(specNode, childElem);
             attrNode = XUtil::getNextSiblingElement(childElem);
         }
         else if (XMLString::equals(childName, SchemaSymbols::fgELT_ALL)) {
 
-            specNode.reset(traverseAll(childElem));
-            checkMinMax(specNode.get(), childElem, All_Group);
+            specNodeJan.reset(traverseAll(childElem));
+            specNode = specNodeJan.get();
+            checkMinMax(specNode, childElem, All_Group);
             attrNode = XUtil::getNextSiblingElement(childElem);
         }
         else if (isAttrOrAttrGroup(childElem)) {
@@ -6113,8 +6124,9 @@
         }
     }
 
-    typeInfo->setContentSpec(specNode.get());
+    typeInfo->setContentSpec(specNode);
     typeInfo->setAdoptContentSpec(true);
+    specNodeJan.release();
 
     // -----------------------------------------------------------------------
     // Merge in information from base, if it exists
@@ -6141,17 +6153,19 @@
 
             // Compose the final content model by concatenating the base and
             // the current in sequence
-            if (!specNode.get()) {
+            if (!specNode) {
 
                 if (baseSpecNode) {
-                    specNode.reset(new (fGrammarPoolMemoryManager) ContentSpecNode(*baseSpecNode));
-                    typeInfo->setContentSpec(specNode.get());
+                    specNodeJan.reset(new (fGrammarPoolMemoryManager) ContentSpecNode(*baseSpecNode));
+                    specNode = specNodeJan.get();
+                    typeInfo->setContentSpec(specNode);
                     typeInfo->setAdoptContentSpec(true);
+                    specNodeJan.release();
                 }
             }
             else if (baseSpecNode) {
 
-                if (specNode.get()->hasAllContent() || baseSpecNode->hasAllContent()) {
+                if (specNode->hasAllContent() || baseSpecNode->hasAllContent()) {
 
                     reportSchemaError(ctElem, XMLUni::fgXMLErrDomain, XMLErrs::NotAllContent);
                     throw TraverseSchema::InvalidComplexTypeInfo; // REVISIT - should we continue
@@ -6172,7 +6186,7 @@
                     (
                         ContentSpecNode::ModelGroupSequence
                         , new (fGrammarPoolMemoryManager) ContentSpecNode(*baseSpecNode)
-                        , specNode.get()
+                        , specNode
                         , true
                         , true
                         , fGrammarPoolMemoryManager
@@ -6207,7 +6221,7 @@
         anySpecNode->setMinOccurs(0);
         anySpecNode->setMaxOccurs(SchemaSymbols::XSD_UNBOUNDED);
 
-        if (!specNode.get()) {
+        if (!specNode) {
             typeInfo->setContentSpec(anySpecNode);
             typeInfo->setDerivedBy(typeDerivedBy);
         }
@@ -6220,7 +6234,7 @@
                 (
                     ContentSpecNode::ModelGroupSequence
                     , anySpecNode
-                    , specNode.get()
+                    , specNode
                     , true
                     , true
                     , fGrammarPoolMemoryManager
@@ -6239,7 +6253,7 @@
     }
     else if (isMixed) {
 
-        if (specNode.get() != 0) {
+        if (specNode != 0) {
             typeInfo->setContentType(SchemaElementDecl::Mixed_Complex);
         }
         else {
@@ -6285,8 +6299,7 @@
     }
     else if (baseTypeInfo != 0 || isBaseAnyType) {
         processAttributes(ctElem, 0, typeInfo, isBaseAnyType);
-    }
-    specNode.release();
+    }   
 }
 
 
@@ -7936,7 +7949,7 @@
     // ------------------------------------------------------------------
     fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
                         ((XSDElementNSImpl*) redefineElem)->getLineNo(),
-                        ((XSDElementNSImpl*) redefineElem)->getColumnNo());    
+                        ((XSDElementNSImpl*) redefineElem)->getColumnNo());      
     InputSource*         srcToFill = resolveSchemaLocation(schemaLocation,
                                         XMLResourceIdentifier::SchemaRedefine);
     Janitor<InputSource> janSrc(srcToFill);
@@ -8029,9 +8042,9 @@
 
         traverseSchemaHeader(root);
         fSchemaInfoList->put((void*) fSchemaInfo->getCurrentSchemaURL(), fSchemaInfo->getTargetNSURI(), fSchemaInfo);
-        redefSchemaInfo->addSchemaInfo(fSchemaInfo, SchemaInfo::INCLUDE);
-        fPreprocessedNodes->put((void*) redefineElem, fSchemaInfo);
         newSchemaInfo.release();
+        redefSchemaInfo->addSchemaInfo(fSchemaInfo, SchemaInfo::INCLUDE);
+        fPreprocessedNodes->put((void*) redefineElem, fSchemaInfo);        
     }
 
     return true;
@@ -8490,7 +8503,6 @@
 
     fXSDErrorReporter.emitError(except, fLocator);
 }
-
 // ---------------------------------------------------------------------------
 //  TraverseSchema: Init/CleanUp methods
 // ---------------------------------------------------------------------------
@@ -8511,6 +8523,7 @@
     (
         ENUM_ELT_SIZE * sizeof(ValueVectorOf<unsigned int>*)
     );//new ValueVectorOf<unsigned int>*[ENUM_ELT_SIZE];
+    memset(fGlobalDeclarations, 0, ENUM_ELT_SIZE * sizeof(ValueVectorOf<unsigned int>*));
     for(unsigned int i=0; i < ENUM_ELT_SIZE; i++)
         fGlobalDeclarations[i] = new (fMemoryManager) ValueVectorOf<unsigned int>(8, fMemoryManager);
 
@@ -8534,10 +8547,12 @@
     delete fCurrentTypeNameStack;
     delete fCurrentGroupStack;
 
-    for(unsigned int i=0; i < ENUM_ELT_SIZE; i++)
-        delete fGlobalDeclarations[i];
-
-    fMemoryManager->deallocate(fGlobalDeclarations);//delete [] fGlobalDeclarations;
+    if (fGlobalDeclarations)
+    {
+        for(unsigned int i=0; i < ENUM_ELT_SIZE; i++)
+            delete fGlobalDeclarations[i];
+        fMemoryManager->deallocate(fGlobalDeclarations);//delete [] fGlobalDeclarations;
+    }    
 
     delete fNonXSAttList;
     delete fNotationRegistry;

Modified: xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.cpp?rev=419674&r1=419673&r2=419674&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.cpp Thu Jul  6 12:31:01 2006
@@ -111,9 +111,11 @@
 
 void XMLSchemaDescriptionImpl::setTargetNamespace(const XMLCh* const newNamespace)
 {  
-    if (fNamespace)
+    if (fNamespace) {
         XMLGrammarDescription::getMemoryManager()->deallocate((void*)fNamespace);
-                                
+        fNamespace = 0;
+    }
+    
     fNamespace = XMLString::replicate(newNamespace, XMLGrammarDescription::getMemoryManager()); 
 }
 
@@ -124,18 +126,22 @@
 
 void XMLSchemaDescriptionImpl::setTriggeringComponent(QName* const trigComponent)
 { 
-    if ( fTriggeringComponent)
+    if ( fTriggeringComponent) {
         delete fTriggeringComponent;
-                                
+        fTriggeringComponent = 0;
+    }
+    
     fTriggeringComponent = new (trigComponent->getMemoryManager()) QName(*trigComponent); 
 
 }
 
 void XMLSchemaDescriptionImpl::setEnclosingElementName(QName* const encElement)
 { 
-    if (fEnclosingElementName)
+    if (fEnclosingElementName) {
         delete fEnclosingElementName;
-                                 
+        fEnclosingElementName = 0; 
+    }
+
     fEnclosingElementName = new (encElement->getMemoryManager()) QName(*encElement); 
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org