@@ -854,7 +854,19 @@ MaybeLocal<Object> X509Certificate::New(Environment* env,
854854 if (!ctor->NewInstance (env->context ()).ToLocal (&obj))
855855 return MaybeLocal<Object>();
856856
857- new X509Certificate (env, obj, std::move (cert), issuer_chain);
857+ Local<Object> issuer_chain_obj;
858+ if (issuer_chain != nullptr && sk_X509_num (issuer_chain)) {
859+ X509Pointer cert (X509_dup (sk_X509_value (issuer_chain, 0 )));
860+ sk_X509_delete (issuer_chain, 0 );
861+ auto maybeObj = sk_X509_num (issuer_chain) ?
862+ X509Certificate::New (env, std::move (cert), issuer_chain) :
863+ X509Certificate::New (env, std::move (cert));
864+ if (!maybeObj.ToLocal (&issuer_chain_obj)) [[unlikely]] {
865+ return MaybeLocal<Object>();
866+ }
867+ }
868+
869+ new X509Certificate (env, obj, std::move (cert), issuer_chain_obj);
858870 return scope.Escape (obj);
859871}
860872
@@ -905,20 +917,13 @@ X509Certificate::X509Certificate(
905917 Environment* env,
906918 Local<Object> object,
907919 std::shared_ptr<ManagedX509> cert,
908- STACK_OF (X509)* issuer_chain)
920+ Local<Object> issuer_chain)
909921 : BaseObject(env, object),
910922 cert_(std::move(cert)) {
911923 MakeWeak ();
912924
913- if (issuer_chain != nullptr && sk_X509_num (issuer_chain)) {
914- X509Pointer cert (X509_dup (sk_X509_value (issuer_chain, 0 )));
915- sk_X509_delete (issuer_chain, 0 );
916- Local<Object> obj = sk_X509_num (issuer_chain)
917- ? X509Certificate::New (env, std::move (cert), issuer_chain)
918- .ToLocalChecked ()
919- : X509Certificate::New (env, std::move (cert))
920- .ToLocalChecked ();
921- issuer_cert_.reset (Unwrap<X509Certificate>(obj));
925+ if (!issuer_chain.IsEmpty ()) {
926+ issuer_cert_.reset (Unwrap<X509Certificate>(issuer_chain));
922927 }
923928}
924929
0 commit comments