Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Unified Diff: net/socket/ssl_client_socket_nss.cc

Issue 7995009: net: fix crash when failing to import a client-side cert into NSS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ... Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | net/socket/ssl_server_socket_nss.cc » ('j') | net/socket/ssl_server_socket_nss.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/socket/ssl_client_socket_nss.cc
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index 879689ad6dd149d58a656858cf558d424074efd1..0caa47f9eba45ee2b2ae101a082e0ada733ffeda 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -2166,6 +2166,13 @@ SECStatus SSLClientSocketNSS::PlatformClientAuthHandler(
CERTCertDBHandle* db_handle = CERT_GetDefaultCertDB();
CERTCertificate* user_cert = CERT_NewTempCertificate(
db_handle, &der_cert, NULL, PR_FALSE, PR_TRUE);
+ if (!user_cert) {
+ // Importing the certificate can fail for reasons including a serial
+ // number collision. See crbug.com/97355.
+ CERT_DestroyCertList(*result_certs);
+ *result_certs = NULL;
+ return SECFailure;
mattm 2011/09/22 23:19:21 Oh, these two cases also need to (maybe) decref th
wtc 2011/09/23 00:55:55 mattm is right. Perhaps we should do the error cl
agl 2011/09/23 17:52:22 Indeed, the state to be cleaned up is much more co
wtc 2011/09/23 19:53:34 I don't know. Perhaps they trade off easy of use
Ryan Sleevi 2011/09/23 22:33:50 This API was originally introduced and ran on Wind
+ }
CERT_AddCertToListTail(*result_certs, user_cert);
// Add the intermediates.
@@ -2178,6 +2185,11 @@ SECStatus SSLClientSocketNSS::PlatformClientAuthHandler(
CERTCertificate* intermediate = CERT_NewTempCertificate(
db_handle, &der_cert, NULL, PR_FALSE, PR_TRUE);
+ if (!intermediate) {
+ CERT_DestroyCertList(*result_certs);
+ *result_certs = NULL;
+ return SECFailure;
+ }
CERT_AddCertToListTail(*result_certs, intermediate);
}
*result_private_key = key_context;
@@ -2320,6 +2332,12 @@ SECStatus SSLClientSocketNSS::PlatformClientAuthHandler(
der_cert.len = cert_data.Length;
CERTCertificate* nss_cert = CERT_NewTempCertificate(
CERT_GetDefaultCertDB(), &der_cert, NULL, PR_FALSE, PR_TRUE);
+ if (!nss_cert) {
+ // In the event of an NSS error we make up an OS error and reuse
+ // the error handling, below.
+ os_error = errKCCreateChainFailed;
+ break;
+ }
CERT_AddCertToListTail(*result_certs, nss_cert);
}
}
« no previous file with comments | « no previous file | net/socket/ssl_server_socket_nss.cc » ('j') | net/socket/ssl_server_socket_nss.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698