Chromium Code Reviews| Index: net/cert/cert_database_nss.cc |
| diff --git a/net/cert/cert_database_nss.cc b/net/cert/cert_database_nss.cc |
| index 3ac14073f40410a1357caee5341f006a86f599f2..5fa272134a257ac5134e80be5376efee03c2bee1 100644 |
| --- a/net/cert/cert_database_nss.cc |
| +++ b/net/cert/cert_database_nss.cc |
| @@ -11,9 +11,11 @@ |
| #include "base/logging.h" |
| #include "base/observer_list_threadsafe.h" |
| #include "crypto/nss_util.h" |
| +#include "crypto/scoped_nss_types.h" |
| #include "net/base/net_errors.h" |
| #include "net/cert/nss_cert_database.h" |
| #include "net/cert/x509_certificate.h" |
| +#include "net/cert/x509_util_nss.h" |
| namespace net { |
| @@ -82,21 +84,27 @@ int CertDatabase::CheckUserCert(X509Certificate* cert_obj) { |
| int CertDatabase::AddUserCert(X509Certificate* cert_obj) { |
| CERTCertificate* cert = cert_obj->os_cert_handle(); |
| - PK11SlotInfo* slot = NULL; |
| + CK_OBJECT_HANDLE key; |
| + crypto::ScopedPK11Slot slot(PK11_KeyForCertExists(cert, &key, NULL)); |
| + if (!slot.get()) |
| + return ERR_NO_PRIVATE_KEY_FOR_CERT; |
| + |
| + std::string nickname = x509_util::GetUniqueNicknameForSlot( |
| + cert_obj->GetDefaultNickname(USER_CERT), |
| + &cert->derSubject, |
| + slot.get()); |
| + SECStatus rv; |
| { |
| crypto::AutoNSSWriteLock lock; |
| - slot = PK11_ImportCertForKey( |
| - cert, |
| - cert_obj->GetDefaultNickname(net::USER_CERT).c_str(), |
| - NULL); |
| + rv = PK11_ImportCert(slot.get(), cert, key, nickname.c_str(), PR_FALSE); |
| } |
| - if (!slot) { |
| - LOG(ERROR) << "Couldn't import user certificate."; |
| + if (rv != SECSuccess) { |
| + LOG(ERROR) << "Couldn't import user certificate. " << PORT_GetError(); |
|
wtc
2013/05/22 20:58:45
Should we also log an error message on line 90?
Ryan Sleevi
2013/05/22 23:20:19
I'm actually not a big fan of the current error me
|
| return ERR_ADD_USER_CERT_FAILED; |
| } |
| - PK11_FreeSlot(slot); |
| + |
| NotifyObserversOfCertAdded(cert_obj); |
| return OK; |
| } |