| Index: net/base/x509_certificate_nss.cc | 
| =================================================================== | 
| --- net/base/x509_certificate_nss.cc	(revision 52800) | 
| +++ net/base/x509_certificate_nss.cc	(working copy) | 
| @@ -16,7 +16,6 @@ | 
|  | 
| #include "base/logging.h" | 
| #include "base/pickle.h" | 
| -#include "base/scoped_ptr.h" | 
| #include "base/time.h" | 
| #include "base/nss_util.h" | 
| #include "net/base/cert_status_flags.h" | 
| @@ -572,22 +571,6 @@ | 
| return false; | 
| } | 
|  | 
| -SECStatus PR_CALLBACK | 
| -CollectCertsCallback(void* arg, SECItem** certs, int num_certs) { | 
| -  X509Certificate::OSCertHandles* results = | 
| -      reinterpret_cast<X509Certificate::OSCertHandles*>(arg); | 
| - | 
| -  for (int i = 0; i < num_certs; ++i) { | 
| -    X509Certificate::OSCertHandle handle = | 
| -        X509Certificate::CreateOSCertHandleFromBytes( | 
| -            reinterpret_cast<char*>(certs[i]->data), certs[i]->len); | 
| -    if (handle) | 
| -      results->push_back(handle); | 
| -  } | 
| - | 
| -  return SECSuccess; | 
| -} | 
| - | 
| }  // namespace | 
|  | 
| void X509Certificate::Initialize() { | 
| @@ -738,62 +721,24 @@ | 
| // static | 
| X509Certificate::OSCertHandle X509Certificate::CreateOSCertHandleFromBytes( | 
| const char* data, int length) { | 
| -  if (length < 0) | 
| -    return NULL; | 
| - | 
| base::EnsureNSSInit(); | 
|  | 
| if (!NSS_IsInitialized()) | 
| return NULL; | 
|  | 
| -  SECItem der_cert; | 
| -  der_cert.data = reinterpret_cast<unsigned char*>(const_cast<char*>(data)); | 
| -  der_cert.len  = length; | 
| -  der_cert.type = siDERCertBuffer; | 
| +  // Make a copy of |data| since CERT_DecodeCertPackage might modify it. | 
| +  char* data_copy = new char[length]; | 
| +  memcpy(data_copy, data, length); | 
|  | 
| // Parse into a certificate structure. | 
| -  return CERT_NewTempCertificate(CERT_GetDefaultCertDB(), &der_cert, NULL, | 
| -                                 PR_FALSE, PR_TRUE); | 
| +  CERTCertificate* cert = CERT_DecodeCertFromPackage(data_copy, length); | 
| +  delete [] data_copy; | 
| +  if (!cert) | 
| +    LOG(ERROR) << "Couldn't parse a certificate from " << length << " bytes"; | 
| +  return cert; | 
| } | 
|  | 
| // static | 
| -X509Certificate::OSCertHandles X509Certificate::CreateOSCertHandlesFromBytes( | 
| -    const char* data, int length, Format format) { | 
| -  OSCertHandles results; | 
| -  if (length < 0) | 
| -    return results; | 
| - | 
| -  base::EnsureNSSInit(); | 
| - | 
| -  if (!NSS_IsInitialized()) | 
| -    return results; | 
| - | 
| -  switch (format) { | 
| -    case FORMAT_DER: { | 
| -      OSCertHandle handle = CreateOSCertHandleFromBytes(data, length); | 
| -      if (handle) | 
| -        results.push_back(handle); | 
| -      break; | 
| -    } | 
| -    case FORMAT_PKCS7: { | 
| -      // Make a copy since CERT_DecodeCertPackage may modify it | 
| -      std::vector<char> data_copy(data, data + length); | 
| - | 
| -      SECStatus result = CERT_DecodeCertPackage(&data_copy[0], | 
| -          length, CollectCertsCallback, &results); | 
| -      if (result != SECSuccess) | 
| -        results.clear(); | 
| -      break; | 
| -    } | 
| -    default: | 
| -      NOTREACHED() << "Certificate format " << format << " unimplemented"; | 
| -      break; | 
| -  } | 
| - | 
| -  return results; | 
| -} | 
| - | 
| -// static | 
| X509Certificate::OSCertHandle X509Certificate::DupOSCertHandle( | 
| OSCertHandle cert_handle) { | 
| return CERT_DupCertificate(cert_handle); | 
|  |