Skip to content
This repository was archived by the owner on Mar 4, 2020. It is now read-only.

Commit 4f63360

Browse files
davidbendeepak1556
authored andcommitted
crypto: don't crash X509ToObject on error
Use MaybeLocal::ToLocal and don't crash X509ToObject on error. PR-URL: nodejs/node#25717 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
1 parent c2ac649 commit 4f63360

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

src/node_crypto.cc

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1556,24 +1556,27 @@ static void AddFingerprintDigest(const unsigned char* md,
15561556
}
15571557
}
15581558

1559+
15591560
static MaybeLocal<Object> ECPointToBuffer(Environment* env,
15601561
const EC_GROUP* group,
15611562
const EC_POINT* point,
1562-
point_conversion_form_t form) {
1563+
point_conversion_form_t form,
1564+
const char** error) {
15631565
size_t len = EC_POINT_point2oct(group, point, form, nullptr, 0, nullptr);
15641566
if (len == 0) {
1565-
env->ThrowError("Failed to get public key length");
1567+
if (error != nullptr) *error = "Failed to get public key length";
15661568
return MaybeLocal<Object>();
15671569
}
15681570
MallocedBuffer<unsigned char> buf(len);
15691571
len = EC_POINT_point2oct(group, point, form, buf.data, buf.size, nullptr);
15701572
if (len == 0) {
1571-
env->ThrowError("Failed to get public key");
1573+
if (error != nullptr) *error = "Failed to get public key";
15721574
return MaybeLocal<Object>();
15731575
}
15741576
return Buffer::New(env, buf.release(), len);
15751577
}
15761578

1579+
15771580
static Local<Object> X509ToObject(Environment* env, X509* cert) {
15781581
EscapableHandleScope scope(env->isolate());
15791582
Local<Context> context = env->context();
@@ -4474,6 +4477,7 @@ void ECDH::GetPublicKey(const FunctionCallbackInfo<Value>& args) {
44744477
ECDH* ecdh;
44754478
ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
44764479

4480+
const EC_GROUP* group = EC_KEY_get0_group(ecdh->key_.get());
44774481
const EC_POINT* pub = EC_KEY_get0_public_key(ecdh->key_.get());
44784482
if (pub == nullptr)
44794483
return env->ThrowError("Failed to get ECDH public key");
@@ -4482,10 +4486,11 @@ void ECDH::GetPublicKey(const FunctionCallbackInfo<Value>& args) {
44824486
uint32_t val = args[0].As<Uint32>()->Value();
44834487
point_conversion_form_t form = static_cast<point_conversion_form_t>(val);
44844488

4485-
MaybeLocal<Object> buf =
4486-
ECPointToBuffer(env, EC_KEY_get0_group(ecdh->key_.get()), pub, form);
4487-
if (buf.IsEmpty()) return;
4488-
args.GetReturnValue().Set(buf.ToLocalChecked());
4489+
const char* error;
4490+
Local<Object> buf;
4491+
if (!ECPointToBuffer(env, group, pub, form, &error).ToLocal(&buf))
4492+
return env->ThrowError(error);
4493+
args.GetReturnValue().Set(buf);
44894494
}
44904495

44914496

@@ -5088,9 +5093,11 @@ void ConvertKey(const FunctionCallbackInfo<Value>& args) {
50885093
uint32_t val = args[2].As<Uint32>()->Value();
50895094
point_conversion_form_t form = static_cast<point_conversion_form_t>(val);
50905095

5091-
MaybeLocal<Object> buf = ECPointToBuffer(env, group.get(), pub.get(), form);
5092-
if (buf.IsEmpty()) return;
5093-
args.GetReturnValue().Set(buf.ToLocalChecked());
5096+
const char* error;
5097+
Local<Object> buf;
5098+
if (!ECPointToBuffer(env, group.get(), pub.get(), form, &error).ToLocal(&buf))
5099+
return env->ThrowError(error);
5100+
args.GetReturnValue().Set(buf);
50945101
}
50955102

50965103

0 commit comments

Comments
 (0)