use RAII to manager RSA pointers
Tested:
unit tests.
Signed-off-by: Nan Zhou <nanzhoumails@gmail.com>
Change-Id: I8888f01e0f64836ca36f03c79307c1044d0dae44
diff --git a/certs_manager.cpp b/certs_manager.cpp
index 9adca20..9a81991 100644
--- a/certs_manager.cpp
+++ b/certs_manager.cpp
@@ -466,12 +466,11 @@
log<level::ERR>("Error occurred during BN_set_word call");
elog<InternalFailure>();
}
-
- RSA* rsa = RSA_new();
- ret = RSA_generate_key_ex(rsa, keyBitLen, bne.get(), nullptr);
+ using RSAPtr = std::unique_ptr<RSA, decltype(&::RSA_free)>;
+ RSAPtr rsa(RSA_new(), ::RSA_free);
+ ret = RSA_generate_key_ex(rsa.get(), keyBitLen, bne.get(), nullptr);
if (ret != 1)
{
- free(rsa);
log<level::ERR>("Error occurred during RSA_generate_key_ex call",
entry("KEYBITLENGTH=%PRIu64", keyBitLen));
elog<InternalFailure>();
@@ -479,14 +478,14 @@
// set public key of x509 req
EVP_PKEY_Ptr pKey(EVP_PKEY_new(), ::EVP_PKEY_free);
- ret = EVP_PKEY_assign_RSA(pKey.get(), rsa);
+ ret = EVP_PKEY_assign_RSA(pKey.get(), rsa.get());
if (ret == 0)
{
- free(rsa);
log<level::ERR>("Error occurred during assign rsa key into EVP");
elog<InternalFailure>();
}
-
+ // Now |rsa| is managed by |pKey|
+ rsa.release();
return pKey;
#else