From ea8dd8656fc3287803c3ad7928865922948ca54d Mon Sep 17 00:00:00 2001 From: Scott Cantor Date: Fri, 22 Jun 2007 17:35:23 +0000 Subject: [PATCH] Handle failures properly. --- shibsp/impl/XMLServiceProvider.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/shibsp/impl/XMLServiceProvider.cpp b/shibsp/impl/XMLServiceProvider.cpp index ed4d851..9cd852c 100644 --- a/shibsp/impl/XMLServiceProvider.cpp +++ b/shibsp/impl/XMLServiceProvider.cpp @@ -240,6 +240,7 @@ namespace { private: void doExtensions(const DOMElement* e, const char* label, Category& log); + void cleanup(); const XMLConfig* m_outer; DOMDocument* m_document; @@ -823,20 +824,30 @@ void XMLApplication::cleanup() listener->unregListener(addr.c_str(),this); } delete m_unsetLock; + m_unsetLock = NULL; for_each(m_handlers.begin(),m_handlers.end(),xmltooling::cleanup()); + m_handlers.clear(); #ifndef SHIBSP_LITE delete m_partyDefault; + m_partyDefault = NULL; #ifdef HAVE_GOOD_STL for_each(m_partyMap.begin(),m_partyMap.end(),cleanup_pair()); #else for_each(m_partyMap.begin(),m_partyMap.end(),cleanup_pair()); #endif + m_partyMap.clear(); delete m_credResolver; + m_credResolver = NULL; delete m_attrResolver; + m_attrResolver = NULL; delete m_attrFilter; + m_attrFilter = NULL; delete m_attrExtractor; + m_attrExtractor = NULL; delete m_trust; + m_trust = NULL; delete m_metadata; + m_metadata = NULL; #endif } @@ -1293,12 +1304,12 @@ XMLConfigImpl::XMLConfigImpl(const DOMElement* e, bool first, const XMLConfig* o } } catch (exception&) { - this->~XMLConfigImpl(); + cleanup(); throw; } #ifndef _DEBUG catch (...) { - this->~XMLConfigImpl(); + cleanup(); throw; } #endif @@ -1306,16 +1317,25 @@ XMLConfigImpl::XMLConfigImpl(const DOMElement* e, bool first, const XMLConfig* o XMLConfigImpl::~XMLConfigImpl() { + cleanup(); +} + +void XMLConfigImpl::cleanup() +{ for_each(m_appmap.begin(),m_appmap.end(),cleanup_pair()); + m_appmap.clear(); #ifndef SHIBSP_LITE for (map< string,pair > >::iterator i=m_policyMap.begin(); i!=m_policyMap.end(); ++i) { delete i->second.first; for_each(i->second.second.begin(), i->second.second.end(), xmltooling::cleanup()); } + m_policyMap.clear(); #endif delete m_requestMapper; + m_requestMapper = NULL; if (m_document) m_document->release(); + m_document = NULL; } void XMLConfig::receive(DDF& in, ostream& out) -- 2.1.4