cargilld 2005/04/05 08:12:37 Modified: c/src/xercesc/internal DGXMLScanner.cpp IGXMLScanner.cpp IGXMLScanner2.cpp ReaderMgr.cpp ReaderMgr.hpp SGXMLScanner.cpp XMLScanner.cpp c/src/xercesc/validators/DTD DTDScanner.cpp c/src/xercesc/validators/schema TraverseSchema.cpp Log: Implement support for disabling default entity resolution. Revision Changes Path 1.63 +49 -42 xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp Index: DGXMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp,v retrieving revision 1.62 retrieving revision 1.63 diff -u -r1.62 -r1.63 --- DGXMLScanner.cpp 4 Apr 2005 15:11:37 -0000 1.62 +++ DGXMLScanner.cpp 5 Apr 2005 15:12:36 -0000 1.63 @@ -980,46 +980,48 @@ if (fUseCachedGrammar && !hasIntSubset) { srcUsed = resolveSystemId(sysId, pubId); - janSrc.reset(srcUsed); - Grammar* grammar = fGrammarResolver->getGrammar(srcUsed->getSystemId()); + if (srcUsed) { + janSrc.reset(srcUsed); + Grammar* grammar = fGrammarResolver->getGrammar(srcUsed->getSystemId()); - if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) { + if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) { - fDTDGrammar = (DTDGrammar*) grammar; - fGrammar = fDTDGrammar; - fValidator->setGrammar(fGrammar); - // If we don't report at least the external subset boundaries, - // an advanced document handler cannot know when the DTD end, - // since we've already sent a doctype decl that indicates there's - // there's an external subset. - if (fDocTypeHandler) - { - fDocTypeHandler->startExtSubset(); - fDocTypeHandler->endExtSubset(); - } - // we *cannot* identify the root element on - // cached grammars; else we risk breaking multithreaded - // applications. - NG - /******* - rootDecl = (DTDElementDecl*) fGrammar->getElemDecl(fEmptyNamespaceId, 0, bbRootName.getRawBuffer(), Grammar::TOP_LEVEL_SCOPE); - - if (rootDecl) - ((DTDGrammar*)fGrammar)->setRootElemId(rootDecl->getId()); - else { - rootDecl = new (fGrammarPoolMemoryManager) DTDElementDecl - ( - bbRootName.getRawBuffer() - , fEmptyNamespaceId - , DTDElementDecl::Any - , fGrammarPoolMemoryManager - ); - rootDecl->setCreateReason(DTDElementDecl::AsRootElem); - rootDecl->setExternalElemDeclaration(true); - ((DTDGrammar*)fGrammar)->setRootElemId(fGrammar->putElemDecl(rootDecl)); - } - *********/ + fDTDGrammar = (DTDGrammar*) grammar; + fGrammar = fDTDGrammar; + fValidator->setGrammar(fGrammar); + // If we don't report at least the external subset boundaries, + // an advanced document handler cannot know when the DTD end, + // since we've already sent a doctype decl that indicates there's + // there's an external subset. + if (fDocTypeHandler) + { + fDocTypeHandler->startExtSubset(); + fDocTypeHandler->endExtSubset(); + } + // we *cannot* identify the root element on + // cached grammars; else we risk breaking multithreaded + // applications. - NG + /******* + rootDecl = (DTDElementDecl*) fGrammar->getElemDecl(fEmptyNamespaceId, 0, bbRootName.getRawBuffer(), Grammar::TOP_LEVEL_SCOPE); + + if (rootDecl) + ((DTDGrammar*)fGrammar)->setRootElemId(rootDecl->getId()); + else { + rootDecl = new (fGrammarPoolMemoryManager) DTDElementDecl + ( + bbRootName.getRawBuffer() + , fEmptyNamespaceId + , DTDElementDecl::Any + , fGrammarPoolMemoryManager + ); + rootDecl->setCreateReason(DTDElementDecl::AsRootElem); + rootDecl->setExternalElemDeclaration(true); + ((DTDGrammar*)fGrammar)->setRootElemId(fGrammar->putElemDecl(rootDecl)); + } + *********/ - return; + return; + } } } @@ -1035,7 +1037,7 @@ , XMLReader::RefFrom_NonLiteral , XMLReader::Type_General , XMLReader::Source_External - , fCalculateSrcOfs + , fCalculateSrcOfs ); } else { @@ -1049,12 +1051,13 @@ , XMLReader::Source_External , srcUsed , fCalculateSrcOfs + , fDisableDefaultEntityResolution ); janSrc.reset(srcUsed); } // If it failed then throw an exception if (!reader) - ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenDTD, srcUsed->getSystemId(), fMemoryManager); + ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenDTD, srcUsed ? srcUsed->getSystemId() : sysId, fMemoryManager); if (fToCacheGrammar) { @@ -2479,7 +2482,7 @@ fReaderMgr.getLastExtEntityInfo(lastInfo); XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity, expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId); - srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier); + srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier); } else { @@ -2490,6 +2493,9 @@ // have to create one on our own. if (!srcToFill) { + if (fDisableDefaultEntityResolution) + return srcToFill; + ReaderMgr::LastExtEntityInfo lastInfo; fReaderMgr.getLastExtEntityInfo(lastInfo); @@ -3222,6 +3228,7 @@ , XMLReader::Source_External , srcUsed , fCalculateSrcOfs + , fDisableDefaultEntityResolution ); // Put a janitor on the source so it gets cleaned up on exit @@ -3230,7 +3237,7 @@ // If the creation failed, and its not because the source was empty, // then emit an error and return. if (!reader) - ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenExtEntity, srcUsed->getSystemId(), fMemoryManager); + ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenExtEntity, srcUsed ? srcUsed->getSystemId() : decl->getSystemId(), fMemoryManager); // Push the reader. If its a recursive expansion, then emit an error // and return an failure. 1.90 +39 -36 xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp Index: IGXMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp,v retrieving revision 1.89 retrieving revision 1.90 diff -u -r1.89 -r1.90 --- IGXMLScanner.cpp 5 Apr 2005 14:05:04 -0000 1.89 +++ IGXMLScanner.cpp 5 Apr 2005 15:12:36 -0000 1.90 @@ -1432,44 +1432,46 @@ if (fUseCachedGrammar && !hasIntSubset) { srcUsed = resolveSystemId(sysId, pubId); - janSrc.reset(srcUsed); - Grammar* grammar = fGrammarResolver->getGrammar(srcUsed->getSystemId()); + if (srcUsed) { + janSrc.reset(srcUsed); + Grammar* grammar = fGrammarResolver->getGrammar(srcUsed->getSystemId()); - if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) { + if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) { - fDTDGrammar = (DTDGrammar*) grammar; - fGrammar = fDTDGrammar; - fValidator->setGrammar(fGrammar); - // If we don't report at least the external subset boundaries, - // an advanced document handler cannot know when the DTD end, - // since we've already sent a doctype decl that indicates there's - // there's an external subset. - if (fDocTypeHandler) - { - fDocTypeHandler->startExtSubset(); - fDocTypeHandler->endExtSubset(); - } - // should not be modifying cached grammars! - /******** - rootDecl = (DTDElementDecl*) fGrammar->getElemDecl(fEmptyNamespaceId, 0, bbRootName.getRawBuffer(), Grammar::TOP_LEVEL_SCOPE); + fDTDGrammar = (DTDGrammar*) grammar; + fGrammar = fDTDGrammar; + fValidator->setGrammar(fGrammar); + // If we don't report at least the external subset boundaries, + // an advanced document handler cannot know when the DTD end, + // since we've already sent a doctype decl that indicates there's + // there's an external subset. + if (fDocTypeHandler) + { + fDocTypeHandler->startExtSubset(); + fDocTypeHandler->endExtSubset(); + } + // should not be modifying cached grammars! + /******** + rootDecl = (DTDElementDecl*) fGrammar->getElemDecl(fEmptyNamespaceId, 0, bbRootName.getRawBuffer(), Grammar::TOP_LEVEL_SCOPE); - if (rootDecl) - ((DTDGrammar*)fGrammar)->setRootElemId(rootDecl->getId()); - else { - rootDecl = new (fGrammarPoolMemoryManager) DTDElementDecl - ( - bbRootName.getRawBuffer() - , fEmptyNamespaceId - , DTDElementDecl::Any - , fGrammarPoolMemoryManager - ); - rootDecl->setCreateReason(DTDElementDecl::AsRootElem); - rootDecl->setExternalElemDeclaration(true); - ((DTDGrammar*)fGrammar)->setRootElemId(fGrammar->putElemDecl(rootDecl)); - } - ********/ + if (rootDecl) + ((DTDGrammar*)fGrammar)->setRootElemId(rootDecl->getId()); + else { + rootDecl = new (fGrammarPoolMemoryManager) DTDElementDecl + ( + bbRootName.getRawBuffer() + , fEmptyNamespaceId + , DTDElementDecl::Any + , fGrammarPoolMemoryManager + ); + rootDecl->setCreateReason(DTDElementDecl::AsRootElem); + rootDecl->setExternalElemDeclaration(true); + ((DTDGrammar*)fGrammar)->setRootElemId(fGrammar->putElemDecl(rootDecl)); + } + ********/ - return; + return; + } } } @@ -1499,12 +1501,13 @@ , XMLReader::Source_External , srcUsed , fCalculateSrcOfs + , fDisableDefaultEntityResolution ); janSrc.reset(srcUsed); } // If it failed then throw an exception if (!reader) - ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenDTD, srcUsed->getSystemId(), fMemoryManager); + ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenDTD, srcUsed ? srcUsed->getSystemId() : sysId, fMemoryManager); if (fToCacheGrammar) { 1.85 +9 -2 xml-xerces/c/src/xercesc/internal/IGXMLScanner2.cpp Index: IGXMLScanner2.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner2.cpp,v retrieving revision 1.84 retrieving revision 1.85 diff -u -r1.84 -r1.85 --- IGXMLScanner2.cpp 5 Apr 2005 14:05:04 -0000 1.84 +++ IGXMLScanner2.cpp 5 Apr 2005 15:12:36 -0000 1.85 @@ -1708,6 +1708,9 @@ // have to create one on our own. if (!srcToFill) { + if (fDisableDefaultEntityResolution) + return; + ReaderMgr::LastExtEntityInfo lastInfo; fReaderMgr.getLastExtEntityInfo(lastInfo); @@ -1891,6 +1894,9 @@ // have to create one on our own. if (!srcToFill) { + if (fDisableDefaultEntityResolution) + return srcToFill; + ReaderMgr::LastExtEntityInfo lastInfo; fReaderMgr.getLastExtEntityInfo(lastInfo); @@ -2939,6 +2945,7 @@ , XMLReader::Source_External , srcUsed , fCalculateSrcOfs + , fDisableDefaultEntityResolution ); // Put a janitor on the source so it gets cleaned up on exit @@ -2947,7 +2954,7 @@ // If the creation failed, and its not because the source was empty, // then emit an error and return. if (!reader) - ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenExtEntity, srcUsed->getSystemId(), fMemoryManager); + ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenExtEntity, srcUsed ? srcUsed->getSystemId() : decl->getSystemId(), fMemoryManager); // Push the reader. If its a recursive expansion, then emit an error // and return an failure. 1.29 +11 -3 xml-xerces/c/src/xercesc/internal/ReaderMgr.cpp Index: ReaderMgr.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/ReaderMgr.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- ReaderMgr.cpp 8 Sep 2004 13:56:13 -0000 1.28 +++ ReaderMgr.cpp 5 Apr 2005 15:12:36 -0000 1.29 @@ -465,7 +465,8 @@ , const XMLReader::Types type , const XMLReader::Sources source , InputSource*& srcToFill - , const bool calcSrcOfs) + , const bool calcSrcOfs + , const bool disableDefaultEntityResolution) { //Normalize sysId XMLBuffer normalizedSysId(1023, fMemoryManager); @@ -506,6 +507,9 @@ // if (!srcToFill) { + if (disableDefaultEntityResolution) + return 0; + LastExtEntityInfo lastInfo; getLastExtEntityInfo(lastInfo); @@ -612,7 +616,8 @@ , const XMLReader::Types type , const XMLReader::Sources source , InputSource*& srcToFill - , const bool calcSrcOfs) + , const bool calcSrcOfs + , const bool disableDefaultEntityResolution) { //Normalize sysId XMLBuffer normalizedSysId(1023, fMemoryManager); @@ -651,6 +656,9 @@ // if (!srcToFill) { + if (disableDefaultEntityResolution) + return 0; + LastExtEntityInfo lastInfo; const XMLCh* baseuri=baseURI; 1.18 +5 -0 xml-xerces/c/src/xercesc/internal/ReaderMgr.hpp Index: ReaderMgr.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/ReaderMgr.hpp,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- ReaderMgr.hpp 4 Apr 2005 15:11:38 -0000 1.17 +++ ReaderMgr.hpp 5 Apr 2005 15:12:36 -0000 1.18 @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.18 2005/04/05 15:12:36 cargilld + * Implement support for disabling default entity resolution. + * * Revision 1.17 2005/04/04 15:11:38 cargilld * Fix a problem where illegal qualified names were not reported as errors. Also store the colon position when searching for a qualified name to avoid looking it up again. * @@ -233,6 +236,7 @@ , const XMLReader::Sources source , InputSource*& srcToFill , const bool calcSrcOfs = true + , const bool disableDefaultEntityResolution = false ); XMLReader* createReader ( @@ -245,6 +249,7 @@ , const XMLReader::Sources source , InputSource*& srcToFill , const bool calcSrcOfs = true + , const bool disableDefaultEntityResolution = false ); XMLReader* createIntEntReader ( 1.111 +7 -1 xml-xerces/c/src/xercesc/internal/SGXMLScanner.cpp Index: SGXMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/SGXMLScanner.cpp,v retrieving revision 1.110 retrieving revision 1.111 diff -u -r1.110 -r1.111 --- SGXMLScanner.cpp 4 Apr 2005 15:11:38 -0000 1.110 +++ SGXMLScanner.cpp 5 Apr 2005 15:12:36 -0000 1.111 @@ -3553,6 +3553,9 @@ // have to create one on our own. if (!srcToFill) { + if (fDisableDefaultEntityResolution) + return; + ReaderMgr::LastExtEntityInfo lastInfo; fReaderMgr.getLastExtEntityInfo(lastInfo); @@ -3715,6 +3718,9 @@ // have to create one on our own. if (!srcToFill) { + if (fDisableDefaultEntityResolution) + return 0; + ReaderMgr::LastExtEntityInfo lastInfo; fReaderMgr.getLastExtEntityInfo(lastInfo); 1.81 +10 -6 xml-xerces/c/src/xercesc/internal/XMLScanner.cpp Index: XMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLScanner.cpp,v retrieving revision 1.80 retrieving revision 1.81 diff -u -r1.80 -r1.81 --- XMLScanner.cpp 1 Apr 2005 09:23:31 -0000 1.80 +++ XMLScanner.cpp 5 Apr 2005 15:12:36 -0000 1.81 @@ -1630,6 +1630,8 @@ // First we try to parse it as a URL. If that fails, we assume its // a file and try it that way. if (!srcToUse) { + if (fDisableDefaultEntityResolution) + return 0; try { @@ -1776,12 +1778,14 @@ if (fUseCachedGrammar && hasExtSubset && !fIgnoreCachedDTD) { InputSource* sysIdSrc = resolveSystemId(sysId, pubId); - Janitor<InputSource> janSysIdSrc(sysIdSrc); - Grammar* grammar = fGrammarResolver->getGrammar(sysIdSrc->getSystemId()); + if (sysIdSrc) { + Janitor<InputSource> janSysIdSrc(sysIdSrc); + Grammar* grammar = fGrammarResolver->getGrammar(sysIdSrc->getSystemId()); - if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) - { - ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::Val_CantHaveIntSS, fMemoryManager); + if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) + { + ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::Val_CantHaveIntSS, fMemoryManager); + } } } 1.39 +9 -2 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.38 retrieving revision 1.39 diff -u -r1.38 -r1.39 --- DTDScanner.cpp 20 Mar 2005 19:02:45 -0000 1.38 +++ DTDScanner.cpp 5 Apr 2005 15:12:36 -0000 1.39 @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.39 2005/04/05 15:12:36 cargilld + * Implement support for disabling default entity resolution. + * * Revision 1.38 2005/03/20 19:02:45 cargilld * Implement versions of uppercase and compareIstring that only check a to z, instead of all characters, and don't rely on functionality provided in the transcoders. * @@ -464,6 +467,8 @@ , XMLReader::Type_PE , XMLReader::Source_External , srcUsed + , fScanner->getCalculateSrcOfs() + , fScanner->getDisableDefaultEntityResolution() ); // Put a janitor on the source so its cleaned up on exit @@ -471,7 +476,7 @@ // If the creation failed then throw an exception if (!reader) - ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenExtEntity, srcUsed->getSystemId(), fMemoryManager); + ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenExtEntity, srcUsed ? srcUsed->getSystemId() : decl->getSystemId(), fMemoryManager); // Set the 'throw at end' flag, to the one we were given reader->setThrowAtEnd(throwEndOfExt); @@ -2196,6 +2201,8 @@ , XMLReader::Type_General , XMLReader::Source_External , srcUsed + , fScanner->getCalculateSrcOfs() + , fScanner->getDisableDefaultEntityResolution() ); // Put a janitor on the source so it gets cleaned up on exit @@ -2205,7 +2212,7 @@ // If the creation failed then throw an exception // if (!reader) - ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenExtEntity, srcUsed->getSystemId(), fMemoryManager); + ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::Gen_CouldNotOpenExtEntity, srcUsed ? srcUsed->getSystemId() : decl->getSystemId(), fMemoryManager); // // Push the reader. If its a recursive expansion, then emit an error 1.135 +4 -1 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.134 retrieving revision 1.135 diff -u -r1.134 -r1.135 --- TraverseSchema.cpp 31 Mar 2005 10:45:58 -0000 1.134 +++ TraverseSchema.cpp 5 Apr 2005 15:12:36 -0000 1.135 @@ -6632,6 +6632,9 @@ // the update resolveEntity accepting nameSpace, a schemImport could // pass a null schemaLocation) if (!srcToFill && loc) { + if (fScanner->getDisableDefaultEntityResolution()) + return 0; + XMLURL urlTmp(fMemoryManager); if ((!urlTmp.setURL(fSchemaInfo->getCurrentSchemaURL(), normalizedURI, urlTmp)) || (urlTmp.isRelative()))
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]