Index: chrome/browser/chrome_content_browser_client.cc |
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc |
index 3431ac3a9155a86888459364ecec6f81763cd6fd..4dd74501c28eb61b8c668842d6b5a877de5b6e5e 100644 |
--- a/chrome/browser/chrome_content_browser_client.cc |
+++ b/chrome/browser/chrome_content_browser_client.cc |
@@ -2270,7 +2270,7 @@ void ChromeContentBrowserClient::AllowCertificateError( |
void ChromeContentBrowserClient::SelectClientCertificate( |
content::WebContents* web_contents, |
net::SSLCertRequestInfo* cert_request_info, |
- net::CertificateList client_certs, |
+ net::ClientCertIdentityList client_certs, |
std::unique_ptr<content::ClientCertificateDelegate> delegate) { |
prerender::PrerenderContents* prerender_contents = |
prerender::PrerenderContents::FromWebContents(web_contents); |
@@ -2299,9 +2299,17 @@ void ChromeContentBrowserClient::SelectClientCertificate( |
static_cast<base::DictionaryValue*>(filter.get()); |
for (size_t i = 0; i < client_certs.size(); ++i) { |
- if (CertMatchesFilter(*client_certs[i].get(), *filter_dict)) { |
+ if (CertMatchesFilter(*client_certs[i]->certificate(), *filter_dict)) { |
// Use the first certificate that is matched by the filter. |
- delegate->ContinueWithCertificate(client_certs[i].get()); |
+ // The callback will own |client_certs[i]| and |delegate|, keeping |
+ // them alive until after ContinueWithCertificate is called. |
+ scoped_refptr<net::X509Certificate> cert = |
+ client_certs[i]->certificate(); |
+ net::ClientCertIdentity::SelfOwningAcquirePrivateKey( |
+ std::move(client_certs[i]), |
+ base::Bind( |
+ &content::ClientCertificateDelegate::ContinueWithCertificate, |
+ base::Passed(&delegate), std::move(cert))); |
return; |
} |
} |