@@ -1052,34 +1052,60 @@ void SecureContext::LoadPKCS12(const FunctionCallbackInfo<Value>& args) {
10521052  EVP_PKEY* pkey_ptr = nullptr ;
10531053  X509* cert_ptr = nullptr ;
10541054  STACK_OF (X509)* extra_certs_ptr = nullptr ;
1055-   if  (d2i_PKCS12_bio (in.get (), &p12_ptr) &&
1056-       (p12.reset (p12_ptr), true ) &&  //  Move ownership to the smart pointer.
1057-       PKCS12_parse (p12.get (), pass.data (),
1058-                    &pkey_ptr,
1059-                    &cert_ptr,
1060-                    &extra_certs_ptr) &&
1061-       (pkey.reset (pkey_ptr), cert.reset (cert_ptr),
1062-        extra_certs.reset (extra_certs_ptr), true ) &&  //  Move ownership.
1063-       SSL_CTX_use_certificate_chain (sc->ctx_ .get (),
1064-                                     std::move (cert),
1065-                                     extra_certs.get (),
1066-                                     &sc->cert_ ,
1067-                                     &sc->issuer_ ) &&
1068-       SSL_CTX_use_PrivateKey (sc->ctx_ .get (), pkey.get ())) {
1069-     //  Add CA certs too
1070-     for  (int  i = 0 ; i < sk_X509_num (extra_certs.get ()); i++) {
1071-       X509* ca = sk_X509_value (extra_certs.get (), i);
1072- 
1073-       if  (cert_store == GetOrCreateRootCertStore ()) {
1074-         cert_store = NewRootCertStore ();
1075-         SSL_CTX_set_cert_store (sc->ctx_ .get (), cert_store);
1076-       }
1077-       X509_STORE_add_cert (cert_store, ca);
1078-       SSL_CTX_add_client_CA (sc->ctx_ .get (), ca);
1055+ 
1056+   if  (!d2i_PKCS12_bio (in.get (), &p12_ptr)) {
1057+     goto  done;
1058+   }
1059+ 
1060+   //  Move ownership to the smart pointer:
1061+   p12.reset (p12_ptr);
1062+ 
1063+   if  (!PKCS12_parse (
1064+           p12.get (), pass.data (), &pkey_ptr, &cert_ptr, &extra_certs_ptr)) {
1065+     goto  done;
1066+   }
1067+ 
1068+   //  Move ownership of the parsed data:
1069+   pkey.reset (pkey_ptr);
1070+   cert.reset (cert_ptr);
1071+   extra_certs.reset (extra_certs_ptr);
1072+ 
1073+   if  (!pkey) {
1074+     return  THROW_ERR_CRYPTO_OPERATION_FAILED (
1075+         env, " Unable to load private key from PFX data"  );
1076+   }
1077+ 
1078+   if  (!cert) {
1079+     return  THROW_ERR_CRYPTO_OPERATION_FAILED (
1080+         env, " Unable to load certificate from PFX data"  );
1081+   }
1082+ 
1083+   if  (!SSL_CTX_use_certificate_chain (sc->ctx_ .get (),
1084+                                      std::move (cert),
1085+                                      extra_certs.get (),
1086+                                      &sc->cert_ ,
1087+                                      &sc->issuer_ )) {
1088+     goto  done;
1089+   }
1090+ 
1091+   if  (!SSL_CTX_use_PrivateKey (sc->ctx_ .get (), pkey.get ())) {
1092+     goto  done;
1093+   }
1094+ 
1095+   //  Add CA certs too
1096+   for  (int  i = 0 ; i < sk_X509_num (extra_certs.get ()); i++) {
1097+     X509* ca = sk_X509_value (extra_certs.get (), i);
1098+ 
1099+     if  (cert_store == GetOrCreateRootCertStore ()) {
1100+       cert_store = NewRootCertStore ();
1101+       SSL_CTX_set_cert_store (sc->ctx_ .get (), cert_store);
10791102    }
1080-     ret = true ;
1103+     X509_STORE_add_cert (cert_store, ca);
1104+     SSL_CTX_add_client_CA (sc->ctx_ .get (), ca);
10811105  }
1106+   ret = true ;
10821107
1108+ done:
10831109  if  (!ret) {
10841110    //  TODO(@jasnell): Should this use ThrowCryptoError?
10851111    unsigned  long  err = ERR_get_error ();  //  NOLINT(runtime/int)
0 commit comments