@@ -854,7 +854,20 @@ 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 = |
| 862 | + sk_X509_num(issuer_chain) |
| 863 | + ? X509Certificate::New(env, std::move(cert), issuer_chain) |
| 864 | + : X509Certificate::New(env, std::move(cert)); |
| 865 | + if (!maybeObj.ToLocal(&issuer_chain_obj)) [[unlikely]] { |
| 866 | + return MaybeLocal<Object>(); |
| 867 | + } |
| 868 | + } |
| 869 | + |
| 870 | + new X509Certificate(env, obj, std::move(cert), issuer_chain_obj); |
858 | 871 | return scope.Escape(obj); |
859 | 872 | } |
860 | 873 |
|
@@ -901,24 +914,15 @@ v8::MaybeLocal<v8::Value> X509Certificate::toObject(Environment* env, |
901 | 914 | return X509ToObject(env, cert).FromMaybe(Local<Value>()); |
902 | 915 | } |
903 | 916 |
|
904 | | -X509Certificate::X509Certificate( |
905 | | - Environment* env, |
906 | | - Local<Object> object, |
907 | | - std::shared_ptr<ManagedX509> cert, |
908 | | - STACK_OF(X509)* issuer_chain) |
909 | | - : BaseObject(env, object), |
910 | | - cert_(std::move(cert)) { |
| 917 | +X509Certificate::X509Certificate(Environment* env, |
| 918 | + Local<Object> object, |
| 919 | + std::shared_ptr<ManagedX509> cert, |
| 920 | + Local<Object> issuer_chain) |
| 921 | + : BaseObject(env, object), cert_(std::move(cert)) { |
911 | 922 | MakeWeak(); |
912 | 923 |
|
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)); |
| 924 | + if (!issuer_chain.IsEmpty()) { |
| 925 | + issuer_cert_.reset(Unwrap<X509Certificate>(issuer_chain)); |
922 | 926 | } |
923 | 927 | } |
924 | 928 |
|
|