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