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 <duhamelantoine1995@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy