Skip to content

Commit b027770

Browse files
jasnelladuh95
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 353587f commit b027770

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
@@ -903,7 +903,20 @@ MaybeLocal<Object> X509Certificate::New(Environment* env,
903903
if (!ctor->NewInstance(env->context()).ToLocal(&obj))
904904
return MaybeLocal<Object>();
905905

906-
new X509Certificate(env, obj, std::move(cert), issuer_chain);
906+
Local<Object> issuer_chain_obj;
907+
if (issuer_chain != nullptr && sk_X509_num(issuer_chain)) {
908+
X509Pointer cert(X509_dup(sk_X509_value(issuer_chain, 0)));
909+
sk_X509_delete(issuer_chain, 0);
910+
auto maybeObj =
911+
sk_X509_num(issuer_chain)
912+
? X509Certificate::New(env, std::move(cert), issuer_chain)
913+
: X509Certificate::New(env, std::move(cert));
914+
if (!maybeObj.ToLocal(&issuer_chain_obj)) [[unlikely]] {
915+
return MaybeLocal<Object>();
916+
}
917+
}
918+
919+
new X509Certificate(env, obj, std::move(cert), issuer_chain_obj);
907920
return scope.Escape(obj);
908921
}
909922

@@ -948,24 +961,15 @@ v8::MaybeLocal<v8::Value> X509Certificate::toObject(Environment* env,
948961
return X509ToObject(env, cert).FromMaybe(Local<Value>());
949962
}
950963

951-
X509Certificate::X509Certificate(
952-
Environment* env,
953-
Local<Object> object,
954-
std::shared_ptr<ManagedX509> cert,
955-
STACK_OF(X509)* issuer_chain)
956-
: BaseObject(env, object),
957-
cert_(std::move(cert)) {
964+
X509Certificate::X509Certificate(Environment* env,
965+
Local<Object> object,
966+
std::shared_ptr<ManagedX509> cert,
967+
Local<Object> issuer_chain)
968+
: BaseObject(env, object), cert_(std::move(cert)) {
958969
MakeWeak();
959970

960-
if (issuer_chain != nullptr && sk_X509_num(issuer_chain)) {
961-
X509Pointer cert(X509_dup(sk_X509_value(issuer_chain, 0)));
962-
sk_X509_delete(issuer_chain, 0);
963-
Local<Object> obj = sk_X509_num(issuer_chain)
964-
? X509Certificate::New(env, std::move(cert), issuer_chain)
965-
.ToLocalChecked()
966-
: X509Certificate::New(env, std::move(cert))
967-
.ToLocalChecked();
968-
issuer_cert_.reset(Unwrap<X509Certificate>(obj));
971+
if (!issuer_chain.IsEmpty()) {
972+
issuer_cert_.reset(Unwrap<X509Certificate>(issuer_chain));
969973
}
970974
}
971975

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)