Address certificate object lifetime with wrapper class.
[shibboleth/cpp-xmltooling.git] / xmltooling / signature / impl / InlineKeyResolver.cpp
index 82f0433..897af8e 100644 (file)
@@ -50,8 +50,8 @@ namespace xmlsignature {
 \r
         XSECCryptoKey* resolveKey(const KeyInfo* keyInfo) const;\r
         XSECCryptoKey* resolveKey(DSIGKeyInfoList* keyInfo) const;\r
-        vector<XSECCryptoX509*>::size_type resolveCertificates(const KeyInfo* keyInfo, vector<XSECCryptoX509*>& certs) const;\r
-        vector<XSECCryptoX509*>::size_type resolveCertificates(DSIGKeyInfoList* keyInfo, vector<XSECCryptoX509*>& certs) const;\r
+        vector<XSECCryptoX509*>::size_type resolveCertificates(const KeyInfo* keyInfo, ResolvedCertificates& certs) const;\r
+        vector<XSECCryptoX509*>::size_type resolveCertificates(DSIGKeyInfoList* keyInfo, ResolvedCertificates& certs) const;\r
         XSECCryptoX509CRL* resolveCRL(const KeyInfo* keyInfo) const;\r
         XSECCryptoX509CRL* resolveCRL(DSIGKeyInfoList* keyInfo) const;\r
         \r
@@ -337,7 +337,7 @@ XSECCryptoX509CRL* InlineKeyResolver::resolveCRL(const KeyInfo* keyInfo) const
 }\r
 \r
 vector<XSECCryptoX509*>::size_type InlineKeyResolver::resolveCertificates(\r
-    const KeyInfo* keyInfo, vector<XSECCryptoX509*>& certs\r
+    const KeyInfo* keyInfo, ResolvedCertificates& certs\r
     ) const\r
 {\r
     // Caching?\r
@@ -348,8 +348,9 @@ vector<XSECCryptoX509*>::size_type InlineKeyResolver::resolveCertificates(
         if (i != m_cache.end()) {\r
             // Found in cache, so just return the results.\r
             SharedLock locker(m_lock,false);\r
-            certs.assign(i->second.m_certs.begin(), i->second.m_certs.end());\r
-            return certs.size();\r
+            accessCertificates(certs).assign(i->second.m_certs.begin(), i->second.m_certs.end());\r
+            accessOwned(certs) = false;\r
+            return accessCertificates(certs).size();\r
         }\r
         else {\r
             // Elevate lock.\r
@@ -362,11 +363,13 @@ vector<XSECCryptoX509*>::size_type InlineKeyResolver::resolveCertificates(
                 i = m_cache.insert(make_pair(keyInfo,CacheEntry())).first;\r
                 _resolve(i->first, i->second);\r
             }\r
-            certs.assign(i->second.m_certs.begin(), i->second.m_certs.end());\r
-            return certs.size();\r
+            accessCertificates(certs).assign(i->second.m_certs.begin(), i->second.m_certs.end());\r
+            accessOwned(certs) = false;\r
+            return accessCertificates(certs).size();\r
         }\r
     }\r
-    return _resolveCertificates(keyInfo, certs);\r
+    accessOwned(certs) = true;\r
+    return _resolveCertificates(keyInfo, accessCertificates(certs));\r
 }\r
 \r
 XSECCryptoKey* InlineKeyResolver::resolveKey(DSIGKeyInfoList* keyInfo) const\r
@@ -391,21 +394,22 @@ XSECCryptoKey* InlineKeyResolver::resolveKey(DSIGKeyInfoList* keyInfo) const
 }\r
 \r
 vector<XSECCryptoX509*>::size_type InlineKeyResolver::resolveCertificates(\r
-    DSIGKeyInfoList* keyInfo, vector<XSECCryptoX509*>& certs\r
+    DSIGKeyInfoList* keyInfo, ResolvedCertificates& certs\r
     ) const\r
 {\r
-    certs.clear();\r
+    accessCertificates(certs).clear();\r
+    accessOwned(certs) = false;\r
        DSIGKeyInfoList::size_type sz = keyInfo->getSize();\r
-    for (DSIGKeyInfoList::size_type i=0; certs.empty() && i<sz; ++i) {\r
+    for (DSIGKeyInfoList::size_type i=0; accessCertificates(certs).empty() && i<sz; ++i) {\r
         if (keyInfo->item(i)->getKeyInfoType()==DSIGKeyInfo::KEYINFO_X509) {\r
             DSIGKeyInfoX509* x509 = static_cast<DSIGKeyInfoX509*>(keyInfo->item(i));\r
             int count = x509->getCertificateListSize();\r
             for (int j=0; j<count; ++j) {\r
-                certs.push_back(x509->getCertificateCryptoItem(j));\r
+                accessCertificates(certs).push_back(x509->getCertificateCryptoItem(j));\r
             }\r
         }\r
     }\r
-    return certs.size();\r
+    return accessCertificates(certs).size();\r
 }\r
 \r
 XSECCryptoX509CRL* InlineKeyResolver::resolveCRL(DSIGKeyInfoList* keyInfo) const\r