santuario-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From blaut...@apache.org
Subject cvs commit: xml-security/c/src/utils XSECSafeBuffer.cpp
Date Tue, 18 Feb 2003 11:28:13 GMT
blautenb    2003/02/18 03:28:13

  Modified:    c/src/dsig DSIGSignature.cpp DSIGTransformXPath.cpp
               c/src/tools/checksig checksig.cpp
               c/src/transformers TXFMBase.cpp TXFMXPath.cpp
               c/src/utils XSECSafeBuffer.cpp
  Log:
  Catch and clean up after Xalan exceptions
  
  Revision  Changes    Path
  1.4       +11 -2     xml-security/c/src/dsig/DSIGSignature.cpp
  
  Index: DSIGSignature.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGSignature.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DSIGSignature.cpp	9 Feb 2003 11:13:47 -0000	1.3
  +++ DSIGSignature.cpp	18 Feb 2003 11:28:12 -0000	1.4
  @@ -95,8 +95,10 @@
   // Xerces includes
   
   #include <xercesc/dom/DOMNamedNodeMap.hpp>
  +#include <xercesc/util/Janitor.hpp>
   
   XSEC_USING_XERCES(DOMNamedNodeMap);
  +XSEC_USING_XERCES(Janitor);
   
   // --------------------------------------------------------------------------------
   //           Some useful utility functions
  @@ -798,11 +800,18 @@
   					DSIGTransformList::TransformListVectorType::size_type size, i;
   					size = l->getSize();
   					for (i = 0; i < size; ++ i) {
  -						currentTxfm = l->item(i)->createTransformer(currentTxfm);
  +						try {
  +							currentTxfm = l->item(i)->createTransformer(currentTxfm);
  +						}
  +						catch (...) {
  +							deleteTXFMChain(currentTxfm);
  +							delete l;
  +							throw;
  +						}
   					}
   
   					delete l;
  -			
  +
   				}
   
   				// Find out the type of the final transform and process accordingly
  
  
  
  1.4       +1 -3      xml-security/c/src/dsig/DSIGTransformXPath.cpp
  
  Index: DSIGTransformXPath.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGTransformXPath.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DSIGTransformXPath.cpp	17 Feb 2003 11:23:38 -0000	1.3
  +++ DSIGTransformXPath.cpp	18 Feb 2003 11:28:12 -0000	1.4
  @@ -64,9 +64,7 @@
    *
    * Author(s): Berin Lautenbach
    *
  - * $ID$
  - *
  - * $LOG$
  + * $Id$
    *
    */
   
  
  
  
  1.6       +12 -1     xml-security/c/src/tools/checksig/checksig.cpp
  
  Index: checksig.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/tools/checksig/checksig.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- checksig.cpp	17 Feb 2003 11:22:39 -0000	1.5
  +++ checksig.cpp	18 Feb 2003 11:28:12 -0000	1.6
  @@ -67,6 +67,9 @@
    * $Id$
    *
    * $Log$
  + * Revision 1.6  2003/02/18 11:28:12  blautenb
  + * Catch and clean up after Xalan exceptions
  + *
    * Revision 1.5  2003/02/17 11:22:39  blautenb
    * Now handle relative file URIs in references
    *
  @@ -378,6 +381,14 @@
   
   		ERR_print_errors(bio_err);
   		return 2;
  +	}
  +
  +	catch (...) {
  +
  +		cerr << "Unknown Exception type occured.  Cleaning up and exiting\n" << endl;
  +
  +		return 2;
  +
   	}
   
   	int retResult;
  
  
  
  1.3       +1 -3      xml-security/c/src/transformers/TXFMBase.cpp
  
  Index: TXFMBase.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/transformers/TXFMBase.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TXFMBase.cpp	9 Feb 2003 11:13:51 -0000	1.2
  +++ TXFMBase.cpp	18 Feb 2003 11:28:12 -0000	1.3
  @@ -65,9 +65,7 @@
    *
    * Author(s): Berin Lautenbach
    *
  - * $ID$
  - *
  - * $LOG$
  + * $Id$
    *
    */
   
  
  
  
  1.4       +137 -116  xml-security/c/src/transformers/TXFMXPath.cpp
  
  Index: TXFMXPath.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/transformers/TXFMXPath.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TXFMXPath.cpp	17 Feb 2003 11:21:03 -0000	1.3
  +++ TXFMXPath.cpp	18 Feb 2003 11:28:12 -0000	1.4
  @@ -66,11 +66,6 @@
    *
    * $Id$
    *
  - * $Log$
  - * Revision 1.3  2003/02/17 11:21:03  blautenb
  - * Bug fix to ensure duplicate XPath namespace does not delete document ns
  - *
  - *
    */
   
   
  @@ -104,6 +99,7 @@
   XALAN_USING_XALAN(XPath)
   XALAN_USING_XALAN(NodeRefListBase)
   XALAN_USING_XALAN(XSLTResultTarget)
  +XALAN_USING_XALAN(XSLException)
   
   #endif
   
  @@ -328,187 +324,209 @@
   	XalanDocument		* xd;
   	XalanNode			* contextNode;
   
  +	// Xalan can throw exceptions in all functions, so do one broad catch point.
  +
  +	try {
   	
  -	// Map to Xalan
  -	xd = xpl.createDocument(document);
  +		// Map to Xalan
  +		xd = xpl.createDocument(document);
   
  -	// For performing mapping
  -	XercesDocumentWrapper *xdw = xpl.mapDocumentToWrapper(xd);
  -	XercesWrapperNavigator xwn(xdw);
  +		// For performing mapping
  +		XercesDocumentWrapper *xdw = xpl.mapDocumentToWrapper(xd);
  +		XercesWrapperNavigator xwn(xdw);
   
  -	// Map the "here" node - but only if part of current document
  +		// Map the "here" node - but only if part of current document
   
  -	bool haveHereNode;
  -	XalanNode * hereNode;
  +		bool haveHereNode;
  +		XalanNode * hereNode;
   
  -	if (h->getOwnerDocument() == document) {
  -		
  -		hereNode = xwn.mapNode(h);
  +		if (h->getOwnerDocument() == document) {
  +			
  +			hereNode = xwn.mapNode(h);
   
  -		if (hereNode == NULL) {
  +			if (hereNode == NULL) {
   
  -			hereNode = findHereNodeFromXalan(&xwn, xd, h);
  +				hereNode = findHereNodeFromXalan(&xwn, xd, h);
   
  -			if (hereNode == NULL) {
  +				if (hereNode == NULL) {
   
  -				throw XSECException(XSECException::XPathError,
  -				   "Unable to find here node in Xalan Wrapper map");
  -			}
  +					throw XSECException(XSECException::XPathError,
  +					   "Unable to find here node in Xalan Wrapper map");
  +				}
   
  +			}
  +			haveHereNode = true;
   		}
  -		haveHereNode = true;
  -	}
  -	else
  -		haveHereNode = false;
  +		else
  +			haveHereNode = false;
   
  -	// Now work out what we have to set up in the new processing
  +		// Now work out what we have to set up in the new processing
   
  -	TXFMBase::nodeType inputType = input->getNodeType();
  +		TXFMBase::nodeType inputType = input->getNodeType();
   
  -	XalanDOMString cd;		// For the moment assume the root is the context
  +		XalanDOMString cd;		// For the moment assume the root is the context
   
  -	const XalanDOMChar * cexpr;
  +		const XalanDOMChar * cexpr;
   
  -	safeBuffer contextExpr;
  +		safeBuffer contextExpr;
   
  -	switch (inputType) {
  +		switch (inputType) {
   
  -	case DOM_NODE_DOCUMENT :
  +		case DOM_NODE_DOCUMENT :
   
  -		cd = XalanDOMString("/");		// Root node
  -		cexpr = cd.c_str();
  +			cd = XalanDOMString("/");		// Root node
  +			cexpr = cd.c_str();
   
  -		// The context node is the "root" node
  -		contextNode =
  -			xpe.selectSingleNode(
  -			xds,
  -			xd,
  -			cexpr,
  -			xd->getDocumentElement());
  +			// The context node is the "root" node
  +			contextNode =
  +				xpe.selectSingleNode(
  +				xds,
  +				xd,
  +				cexpr,
  +				xd->getDocumentElement());
   
  -		break;
  +			break;
   
  -	case DOM_NODE_DOCUMENT_FRAGMENT :
  -		{
  +		case DOM_NODE_DOCUMENT_FRAGMENT :
  +			{
   
  -			// Need to map the DOM_Node that we are given from the input to the appropriate XalanNode
  +				// Need to map the DOM_Node that we are given from the input to the appropriate XalanNode
   
  -			// Create the XPath expression to find the node
  +				// Create the XPath expression to find the node
   
  -			if (input->getFragmentId() != NULL) {
  +				if (input->getFragmentId() != NULL) {
   
  -				contextExpr.sbTranscodeIn("//descendant-or-self::node()[attribute::Id='");
  -				contextExpr.sbXMLChCat(input->getFragmentId());
  -				contextExpr.sbXMLChCat("']");
  +					contextExpr.sbTranscodeIn("//descendant-or-self::node()[attribute::Id='");
  +					contextExpr.sbXMLChCat(input->getFragmentId());
  +					contextExpr.sbXMLChCat("']");
   
  -				// Map the node
  +					// Map the node
   
  -				contextNode = 
  -					xpe.selectSingleNode(
  -					xds,
  -					xd,
  -					contextExpr.rawXMLChBuffer(), //XalanDOMString((char *) contextExpr.rawBuffer()).c_str(),

  -					xd->getDocumentElement());
  +					contextNode = 
  +						xpe.selectSingleNode(
  +						xds,
  +						xd,
  +						contextExpr.rawXMLChBuffer(), //XalanDOMString((char *) contextExpr.rawBuffer()).c_str(),

  +						xd->getDocumentElement());
   
   
  -				if (contextNode == NULL) {
  -					// Last Ditch
  -					contextNode = xwn.mapNode(input->getFragmentNode());
  +					if (contextNode == NULL) {
  +						// Last Ditch
  +						contextNode = xwn.mapNode(input->getFragmentNode());
  +
  +					}
   
   				}
  +				else
  +					contextNode = xwn.mapNode(input->getFragmentNode());
   
  -			}
  -			else
  -				contextNode = xwn.mapNode(input->getFragmentNode());
  +				if (contextNode == NULL) {
   
  -			if (contextNode == NULL) {
  +					// Something wrong
  +					throw XSECException(XSECException::XPathError, "Error mapping context node");
   
  -				// Something wrong
  -				throw XSECException(XSECException::XPathError, "Error mapping context node");
  +				}
   
  +				break;
   			}
   
  -			break;
  -		}
  +		default :
   
  -	default :
  +			throw XSECException(XSECException::XPathError);	// Should never get here
   
  -		throw XSECException(XSECException::XPathError);	// Should never get here
  +		}
   
  -	}
  +		safeBuffer str;
  +		XPathEnvSupportDefault xpesd;
  +		XObjectFactoryDefault			xof;
  +		XPathExecutionContextDefault	xpec(xpesd, xds, xof);
  +
  +		ElementPrefixResolverProxy pr(xd->getDocumentElement(), xpesd, xds);
   
  -	safeBuffer str;
  -	XPathEnvSupportDefault xpesd;
  -	XObjectFactoryDefault			xof;
  -	XPathExecutionContextDefault	xpec(xpesd, xds, xof);
  +		// Work around the fact that the XPath implementation is designed for XSLT, so does
  +		// not allow here() as a NCName.
   
  -	ElementPrefixResolverProxy pr(xd->getDocumentElement(), xpesd, xds);
  +		// THIS IS A KLUDGE AND SHOULD BE DONE BETTER
   
  -	// Work around the fact that the XPath implementation is designed for XSLT, so does
  -	// not allow here() as a NCName.
  +		int offset = 0;
  +		safeBuffer k(KLUDGE_PREFIX);
  +		k.sbStrcatIn(":");
   
  -	// THIS IS A KLUDGE AND SHOULD BE DONE BETTER
  +		offset = expr.sbStrstr("here()");
   
  -	int offset = 0;
  -	safeBuffer k(KLUDGE_PREFIX);
  -	k.sbStrcatIn(":");
  +		while (offset >= 0) {
   
  -	offset = expr.sbStrstr("here()");
  +			if (offset == 0 || offset == 1 || 
  +				(!(expr[offset - 1] == ':' && expr[offset - 2] != ':') &&
  +				separator(expr[offset - 1]))) {
   
  -	while (offset >= 0) {
  +				expr.sbStrinsIn(k.rawCharBuffer(), offset);
   
  -		if (offset == 0 || offset == 1 || 
  -			(!(expr[offset - 1] == ':' && expr[offset - 2] != ':') &&
  -			separator(expr[offset - 1]))) {
  +			}
   
  -			expr.sbStrinsIn(k.rawCharBuffer(), offset);
  +			offset = expr.sbOffsetStrstr("here()", offset + 11);
   
   		}
   
  -		offset = expr.sbOffsetStrstr("here()", offset + 11);
  +		// Install the External function in the Environment handler
   
  -	}
  +		if (haveHereNode) {
   
  -	// Install the External function in the Environment handler
  +			xpesd.installExternalFunctionLocal(XalanDOMString(URI_ID_DSIG), XalanDOMString("here"),
DSIGXPathHere(hereNode));
   
  -	if (haveHereNode) {
  +		}
   
  -		xpesd.installExternalFunctionLocal(XalanDOMString(URI_ID_DSIG), XalanDOMString("here"),
DSIGXPathHere(hereNode));
  +		str.sbStrcpyIn("(descendant-or-self::node() | descendant-or-self::node()/attribute::*
| descendant-or-self::node()/namespace::*)[");
  +		str.sbStrcatIn(expr);
  +		str.sbStrcatIn("]");
   
  -	}
  +		XPath * xp = xpf.create();
   
  -	str.sbStrcpyIn("(descendant-or-self::node() | descendant-or-self::node()/attribute::*
| descendant-or-self::node()/namespace::*)[");
  -	str.sbStrcatIn(expr);
  -	str.sbStrcatIn("]");
  +		XalanDOMString Xexpr((char *) str.rawBuffer());
  +		xppi.initXPath(*xp, xpcc, Xexpr, pr);
  +		
  +		// Now resolve
   
  -	XPath * xp = xpf.create();
  +		XObjectPtr xObj = xp->execute(contextNode, pr, xpec);
   
  -	XalanDOMString Xexpr((char *) str.rawBuffer());
  -	xppi.initXPath(*xp, xpcc, Xexpr, pr);
  -	
  -	// Now resolve
  +		// Now map to a list that others can use (naieve list at this time)
   
  -	XObjectPtr xObj = xp->execute(contextNode, pr, xpec);
  +		const NodeRefListBase&	lst = xObj->nodeset();
  +		
  +		int size = lst.getLength();
  +		const DOMNode *item;
  +		
  +		for (int i = 0; i < size; ++ i) {
   
  -	// Now map to a list that others can use (naieve list at this time)
  +			if (lst.item(i) == xd)
  +				m_XPathMap.addNode(document);
  +			else {
  +				item = xwn.mapNode(lst.item(i));
  +				m_XPathMap.addNode(item);
  +			}
  +		}
   
  -	const NodeRefListBase&	lst = xObj->nodeset();
  -	
  -	int size = lst.getLength();
  -	const DOMNode *item;
  -	
  -	for (int i = 0; i < size; ++ i) {
  +		xpesd.uninstallExternalFunctionGlobal(XalanDOMString(URI_ID_DSIG), XalanDOMString("here"));
   
  -		if (lst.item(i) == xd)
  -			m_XPathMap.addNode(document);
  -		else {
  -			item = xwn.mapNode(lst.item(i));
  -			m_XPathMap.addNode(item);
  -		}
   	}
   
  -	xpesd.uninstallExternalFunctionGlobal(XalanDOMString(URI_ID_DSIG), XalanDOMString("here"));
  +	catch (XSLException &e) {
   
  +		safeBuffer msg;
  +
  +		// Whatever happens - fix any changes to the original document
  +		clearXPathNS(document, addedNodes, formatter, mp_nse);
  +	
  +		// Collate the exception message into an XSEC message.		
  +		msg.sbTranscodeIn("Xalan Exception : ");
  +		msg.sbXMLChCat(e.getType().c_str());
  +		msg.sbXMLChCat(" caught.  Message : ");
  +		msg.sbXMLChCat(e.getMessage().c_str());
  +
  +		throw XSECException(XSECException::XPathError,
  +			msg.rawXMLChBuffer());
  +	}
  +	
   	clearXPathNS(document, addedNodes, formatter, mp_nse);
   
   }
  
  
  
  1.3       +2 -4      xml-security/c/src/utils/XSECSafeBuffer.cpp
  
  Index: XSECSafeBuffer.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/utils/XSECSafeBuffer.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XSECSafeBuffer.cpp	9 Feb 2003 11:13:52 -0000	1.2
  +++ XSECSafeBuffer.cpp	18 Feb 2003 11:28:12 -0000	1.3
  @@ -64,9 +64,7 @@
    *
    * Author(s): Berin Lautenbach
    *
  - * $ID$
  - *
  - * $LOG$
  + * $Id$
    *
    */
   
  @@ -524,7 +522,7 @@
   	
   	checkBufferType(BUFFER_UNICODE);
   	unsigned int len = XMLString::stringLen((XMLCh *) buffer) * size_XMLCh;
  -	len += XMLString::stringLen(str);
  +	len += XMLString::stringLen(str) * size_XMLCh;
   	len += (2 * size_XMLCh);
   
   	checkAndExpand(len);
  
  
  

Mime
View raw message