Skip to content

Commit 4093de6

Browse files
jasnellRafaelGSS
authored andcommitted
src: improve error handling in crypto_x509
Avoiding use of ToLocalChecked PR-URL: #57757 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]>
1 parent d309712 commit 4093de6

File tree

2 files changed

+25
-22
lines changed

2 files changed

+25
-22
lines changed

src/crypto/crypto_x509.cc

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,20 @@ 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 =
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);
858871
return scope.Escape(obj);
859872
}
860873

@@ -901,24 +914,15 @@ v8::MaybeLocal<v8::Value> X509Certificate::toObject(Environment* env,
901914
return X509ToObject(env, cert).FromMaybe(Local<Value>());
902915
}
903916

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)) {
911922
MakeWeak();
912923

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));
922926
}
923927
}
924928

src/crypto/crypto_x509.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,10 @@ class X509Certificate final : public BaseObject {
110110
std::unique_ptr<worker::TransferData> CloneForMessaging() const override;
111111

112112
private:
113-
X509Certificate(
114-
Environment* env,
115-
v8::Local<v8::Object> object,
116-
std::shared_ptr<ManagedX509> cert,
117-
STACK_OF(X509)* issuer_chain = nullptr);
113+
X509Certificate(Environment* env,
114+
v8::Local<v8::Object> object,
115+
std::shared_ptr<ManagedX509> cert,
116+
v8::Local<v8::Object> issuer_chain = v8::Local<v8::Object>());
118117

119118
std::shared_ptr<ManagedX509> cert_;
120119
BaseObjectPtr<X509Certificate> issuer_cert_;

0 commit comments

Comments
 (0)