From 1f54fc25cb47f613235b45f29759aa7686d03178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Mon, 5 Sep 2022 22:55:54 +0200 Subject: [PATCH] src: use automatic memory mgmt in SecretKeyGen Avoid manual memory management (i.e., calling MallocOpenSSL). This leaves less room for memory leaks and other bugs. PR-URL: https://github.com/nodejs/node/pull/44479 Reviewed-By: Anna Henningsen Reviewed-By: Ben Noordhuis --- src/crypto/crypto_keygen.cc | 18 ++++++++---------- src/crypto/crypto_keygen.h | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/crypto/crypto_keygen.cc b/src/crypto/crypto_keygen.cc index af489967144d32..684cf8033e72f4 100644 --- a/src/crypto/crypto_keygen.cc +++ b/src/crypto/crypto_keygen.cc @@ -54,8 +54,7 @@ EVPKeyCtxPointer NidKeyPairGenTraits::Setup(NidKeyPairGenConfig* params) { } void SecretKeyGenConfig::MemoryInfo(MemoryTracker* tracker) const { - if (out != nullptr) - tracker->TrackFieldWithSize("out", length); + if (out) tracker->TrackFieldWithSize("out", length); } Maybe SecretKeyGenTraits::AdditionalConfig( @@ -80,18 +79,17 @@ KeyGenJobStatus SecretKeyGenTraits::DoKeyGen( Environment* env, SecretKeyGenConfig* params) { CHECK_LE(params->length, INT_MAX); - params->out = MallocOpenSSL(params->length); - EntropySource(reinterpret_cast(params->out), params->length); + ByteSource::Builder bytes(params->length); + EntropySource(bytes.data(), params->length); + params->out = std::move(bytes).release(); return KeyGenJobStatus::OK; } -Maybe SecretKeyGenTraits::EncodeKey( - Environment* env, - SecretKeyGenConfig* params, - Local* result) { - ByteSource out = ByteSource::Allocated(params->out, params->length); +Maybe SecretKeyGenTraits::EncodeKey(Environment* env, + SecretKeyGenConfig* params, + Local* result) { std::shared_ptr data = - KeyObjectData::CreateSecret(std::move(out)); + KeyObjectData::CreateSecret(std::move(params->out)); return Just(KeyObjectHandle::Create(env, data).ToLocal(result)); } diff --git a/src/crypto/crypto_keygen.h b/src/crypto/crypto_keygen.h index ed7d5c0601fff1..c9c1b3e5ffbb8c 100644 --- a/src/crypto/crypto_keygen.h +++ b/src/crypto/crypto_keygen.h @@ -201,7 +201,7 @@ struct KeyPairGenTraits final { struct SecretKeyGenConfig final : public MemoryRetainer { size_t length; // In bytes. - char* out = nullptr; // Placeholder for the generated key bytes. + ByteSource out; // Placeholder for the generated key bytes. void MemoryInfo(MemoryTracker* tracker) const override; SET_MEMORY_INFO_NAME(SecretKeyGenConfig)