X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-xmltooling.git;a=blobdiff_plain;f=xmltooling%2Fsignature%2Fimpl%2FInlineKeyResolver.cpp;h=897af8e354b556dd8ee5f4399fb2ca3420e4b2d7;hp=82f04331ad4f967c2cc394c1afea2646de7a028f;hb=c1ea20979cdeb36ba3b0899fefcc12e3735cf7eb;hpb=70e44833e8d3753c0d4a82f2c6ae3a0f5affc3c5 diff --git a/xmltooling/signature/impl/InlineKeyResolver.cpp b/xmltooling/signature/impl/InlineKeyResolver.cpp index 82f0433..897af8e 100644 --- a/xmltooling/signature/impl/InlineKeyResolver.cpp +++ b/xmltooling/signature/impl/InlineKeyResolver.cpp @@ -50,8 +50,8 @@ namespace xmlsignature { XSECCryptoKey* resolveKey(const KeyInfo* keyInfo) const; XSECCryptoKey* resolveKey(DSIGKeyInfoList* keyInfo) const; - vector::size_type resolveCertificates(const KeyInfo* keyInfo, vector& certs) const; - vector::size_type resolveCertificates(DSIGKeyInfoList* keyInfo, vector& certs) const; + vector::size_type resolveCertificates(const KeyInfo* keyInfo, ResolvedCertificates& certs) const; + vector::size_type resolveCertificates(DSIGKeyInfoList* keyInfo, ResolvedCertificates& certs) const; XSECCryptoX509CRL* resolveCRL(const KeyInfo* keyInfo) const; XSECCryptoX509CRL* resolveCRL(DSIGKeyInfoList* keyInfo) const; @@ -337,7 +337,7 @@ XSECCryptoX509CRL* InlineKeyResolver::resolveCRL(const KeyInfo* keyInfo) const } vector::size_type InlineKeyResolver::resolveCertificates( - const KeyInfo* keyInfo, vector& certs + const KeyInfo* keyInfo, ResolvedCertificates& certs ) const { // Caching? @@ -348,8 +348,9 @@ vector::size_type InlineKeyResolver::resolveCertificates( if (i != m_cache.end()) { // Found in cache, so just return the results. SharedLock locker(m_lock,false); - certs.assign(i->second.m_certs.begin(), i->second.m_certs.end()); - return certs.size(); + accessCertificates(certs).assign(i->second.m_certs.begin(), i->second.m_certs.end()); + accessOwned(certs) = false; + return accessCertificates(certs).size(); } else { // Elevate lock. @@ -362,11 +363,13 @@ vector::size_type InlineKeyResolver::resolveCertificates( i = m_cache.insert(make_pair(keyInfo,CacheEntry())).first; _resolve(i->first, i->second); } - certs.assign(i->second.m_certs.begin(), i->second.m_certs.end()); - return certs.size(); + accessCertificates(certs).assign(i->second.m_certs.begin(), i->second.m_certs.end()); + accessOwned(certs) = false; + return accessCertificates(certs).size(); } } - return _resolveCertificates(keyInfo, certs); + accessOwned(certs) = true; + return _resolveCertificates(keyInfo, accessCertificates(certs)); } XSECCryptoKey* InlineKeyResolver::resolveKey(DSIGKeyInfoList* keyInfo) const @@ -391,21 +394,22 @@ XSECCryptoKey* InlineKeyResolver::resolveKey(DSIGKeyInfoList* keyInfo) const } vector::size_type InlineKeyResolver::resolveCertificates( - DSIGKeyInfoList* keyInfo, vector& certs + DSIGKeyInfoList* keyInfo, ResolvedCertificates& certs ) const { - certs.clear(); + accessCertificates(certs).clear(); + accessOwned(certs) = false; DSIGKeyInfoList::size_type sz = keyInfo->getSize(); - for (DSIGKeyInfoList::size_type i=0; certs.empty() && iitem(i)->getKeyInfoType()==DSIGKeyInfo::KEYINFO_X509) { DSIGKeyInfoX509* x509 = static_cast(keyInfo->item(i)); int count = x509->getCertificateListSize(); for (int j=0; jgetCertificateCryptoItem(j)); + accessCertificates(certs).push_back(x509->getCertificateCryptoItem(j)); } } } - return certs.size(); + return accessCertificates(certs).size(); } XSECCryptoX509CRL* InlineKeyResolver::resolveCRL(DSIGKeyInfoList* keyInfo) const