OpenSSL函数EVP_PKEY_keygen中的内存泄漏

我只是尝试使用以下方法生成RSA密钥:

#include  #include  int main(void) { OpenSSL_add_all_algorithms(); EVP_PKEY_CTX *ctx; EVP_PKEY *pkey = NULL; ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); if (!ctx) { // error } if (EVP_PKEY_keygen_init(ctx) <= 0) { // error } if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048) <= 0) { // error } if (EVP_PKEY_keygen(ctx, &pkey) <= 0) { // this call seems to leak // error } EVP_PKEY_free(pkey); EVP_PKEY_CTX_free(ctx); EVP_cleanup(); return 0; } 

到目前为止,我不认为我做错了什么。 Valgrind抱怨“在退出时使用:6个街区中的416个字节”。 首先我想,我忘了要释放的东西,之后我尝试了

valgrind openssl genrsa 1024

而且我还“在退出时使用:6个块中的416个字节”。 哼?! 甚至OpenSSL的官方二进制泄密?

Openssl的FAQ告诉我们:

“残酷”(线程不安全)应用程序 – 全局清理function:

ERR_free_strings(),EVP_cleanup()和CRYPTO_cleanup_all_ex_data()。

如果我执行* CRYPTO_cleanup_all_ex_data()*它不会泄漏。 但根据OpenSSL文档,无论这意味着什么,它都是一种“野蛮”的方法。 此function没有进一步的文档。

有没有办法正确清理它?

我在2014年1月6日使用OpenSSL 1.0.1f

OpenSSL的FAQ回答了这个问题(感谢@opalenzuela):

在大多数情况下,明显内存泄漏的原因是在应用程序启动时分配的OpenSSL内部表。 由于这些表格随着时间的推移不会增大,因此它们是无害的。

深入了解OpenSSL的源代码显示:

 /* Release all "ex_data" state to prevent memory leaks. This can't be made * thread-safe without overhauling a lot of stuff, and shouldn't really be * called under potential race-conditions anyway (it's for program shutdown * after all). */ void CRYPTO_cleanup_all_ex_data(void) { IMPL_CHECK EX_IMPL(cleanup)(); }