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 e90776dd85cb24093ca8470a701097d0c9d1c0ce..025f2ec7bef2638562b84af1d09f0b68f6021377 100644 |
--- a/chrome/browser/chrome_content_browser_client.cc |
+++ b/chrome/browser/chrome_content_browser_client.cc |
@@ -2357,7 +2357,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); |
@@ -2386,9 +2386,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; |
} |
} |