https://issues.shibboleth.net/jira/browse/CPPOST-9
[shibboleth/cpp-opensaml.git] / saml / saml2 / metadata / impl / ChainingMetadataProvider.cpp
index 0fb651f..9faca91 100644 (file)
@@ -25,6 +25,7 @@
 #include "saml/binding/SAMLArtifact.h"
 #include "saml2/metadata/ChainingMetadataProvider.h"
 
+#include <memory>
 #include <xercesc/util/XMLUniDefs.hpp>
 #include <xmltooling/logging.h>
 #include <xmltooling/util/XMLHelper.h>
@@ -106,7 +107,6 @@ void ChainingMetadataProvider::init()
 
 Lockable* ChainingMetadataProvider::lock()
 {
-    m_log.debug("locked metadata chain (no-op)");
     return this;   // we're not lockable ourselves...
 }
 
@@ -117,10 +117,6 @@ void ChainingMetadataProvider::unlock()
     if (ptr) {
         m_tlsKey->setData(NULL);
         reinterpret_cast<MetadataProvider*>(ptr)->unlock();
-        m_log.debug("unlocked embedded metadata provider (%p)", ptr);
-    }
-    else {
-        m_log.debug("unlocked metadata chain (no-op)");
     }
 }
 
@@ -172,8 +168,6 @@ const EntitiesDescriptor* ChainingMetadataProvider::getEntitiesDescriptor(const
 
 pair<const EntityDescriptor*,const RoleDescriptor*> ChainingMetadataProvider::getEntityDescriptor(const Criteria& criteria) const
 {
-    bool bRole = (criteria.role && criteria.protocol);  // searching for role also?
-
     // Clear any existing lock.
     const_cast<ChainingMetadataProvider*>(this)->unlock();
 
@@ -182,19 +176,19 @@ pair<const EntityDescriptor*,const RoleDescriptor*> ChainingMetadataProvider::ge
     pair<const EntityDescriptor*,const RoleDescriptor*> ret = pair<const EntityDescriptor*,const RoleDescriptor*>(NULL,NULL);
     pair<const EntityDescriptor*,const RoleDescriptor*> cur = ret;
     for (vector<MetadataProvider*>::const_iterator i=m_providers.begin(); i!=m_providers.end(); ++i) {
-        m_log.debug("locking embedded metadata provider (%p)", *i);
         (*i)->lock();
-        m_log.debug("locked embedded metadata provider (%p)", *i);
         cur = (*i)->getEntityDescriptor(criteria);
         if (cur.first) {
-            if (bRole) {
+            if (criteria.role) {
                 // We want a role also. Did we find one?
                 if (cur.second) {
                     // Are we using a first match policy?
                     if (m_firstMatch) {
+                        // We could have an entity-only match from earlier, so unlock it.
+                        if (held)
+                            held->unlock();
                         // Save locked provider.
                         m_tlsKey->setData(*i);
-                        m_log.debug("leaving embedded metadata provider locked (%p)", *i);
                         return cur;
                     }
 
@@ -242,6 +236,10 @@ pair<const EntityDescriptor*,const RoleDescriptor*> ChainingMetadataProvider::ge
             else {
                 // Are we using a first match policy?
                 if (m_firstMatch) {
+                    // I don't think this can happen, but who cares, check anyway.
+                    if (held)
+                        held->unlock();
+                    
                     // Save locked provider.
                     m_tlsKey->setData(*i);
                     return cur;
@@ -270,9 +268,7 @@ pair<const EntityDescriptor*,const RoleDescriptor*> ChainingMetadataProvider::ge
         }
         else {
             // No match, so just unlock this one and move on.
-            m_log.debug("unlocking embedded metadata provider (%p)", *i);
             (*i)->unlock();
-            m_log.debug("unlocked embedded metadata provider (%p)", *i);
         }
     }