@@ -854,7 +854,19 @@ MaybeLocal<Object> X509Certificate::New(Environment* env,
854
854
if (!ctor->NewInstance (env->context ()).ToLocal (&obj))
855
855
return MaybeLocal<Object>();
856
856
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);
858
870
return scope.Escape (obj);
859
871
}
860
872
@@ -905,20 +917,13 @@ X509Certificate::X509Certificate(
905
917
Environment* env,
906
918
Local<Object> object,
907
919
std::shared_ptr<ManagedX509> cert,
908
- STACK_OF (X509)* issuer_chain)
920
+ Local<Object> issuer_chain)
909
921
: BaseObject(env, object),
910
922
cert_(std::move(cert)) {
911
923
MakeWeak ();
912
924
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));
922
927
}
923
928
}
924
929
0 commit comments