Fixed missing unlock when entity found, but role wasn't.
authorScott Cantor <cantor.2@osu.edu>
Mon, 28 Jan 2008 22:02:09 +0000 (22:02 +0000)
committerScott Cantor <cantor.2@osu.edu>
Mon, 28 Jan 2008 22:02:09 +0000 (22:02 +0000)
saml/saml2/metadata/impl/ChainingMetadataProvider.cpp

index 0fb651f..d0810d8 100644 (file)
@@ -182,9 +182,7 @@ 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) {
@@ -192,9 +190,11 @@ pair<const EntityDescriptor*,const RoleDescriptor*> ChainingMetadataProvider::ge
                 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 +242,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 +274,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);
         }
     }