2017-05-31 3 views
1

特定のユーザーデータを暗号化するためにRSAキーを必要とするアプリケーションを開発しています。私はopensslを使用し、すべて正常に動作します。しかし、RSA_newとRSA_generate_key_ex(私は私が作成したすべてのプロパティをリリースしているので、それがあってはならないと思っていた)で、メモリリークを警告しています。ここでRSA_newとRSA_generate_key_exはメモリリークを引き起こす

は、RSAキーを生成するための私のコードです:

BIGNUM e; 
BN_init(&e); 
BN_set_word(&e, 17); 
RSA *rsa = RSA_new(); // Direct leak of 191 bytes in 1 object (RSA_new->RSA_new_method->...) 
RAS_generate_key_ex(rsa, 1024, &e, NULL); // Indirect leak of 279 bytes in 1 object (RAS_generate_key_ex->rsa_builtin_keygen...) 
EVP_PKEY pkey = EVP_PKEY_new(); 
EVP_PKEY_set1_RSA(pkey, rsa); 
RSA_free(rsa); 
BN_free(&e); 
MINE_COPY_KEY(pkey); // I copy the pkey to other location at here // 
EVP_PKEY_free(pkey); 

私は(E、PKEY、RSA)がすでに "RSA_free、EVP_PKEY_free、およびBN_free" がリリースされているが、それはまだ持っている私によって割り当てられたすべてのものを考えました私は( - >RSA_generate_key_exEVP_PKEY pkey = EVP_PKEY_new() - >EVP_PKEY* pkey = EVP_PKEY_new()などRAS_generate_key_exとしてタイプミスを修正した後で)あなたのプログラムを試してみました

+0

Valgrindを使用してメモリリークレポートを表示してみてください。 – AmeyaVS

+2

漏れを示してください。 OpenSSL wikiの[Library Initialization](https://wiki.openssl.org/index.php/Library_Initialization)も参照してください。ライブラリの起動とシャットダウンの方法を示します。 [OpenSSLのメモリリーク?](https://stackoverflow.com/q/34794272/608639)、[OpenSSL関数のメモリリークEVP_PKEY_keygen](https://stackoverflow.com/q/21532371/608639)、[OpenSSL :: SSL_library_init()memory leak](https://stackoverflow.com/q/11759725/608639)、[OpenSSL関数のメモリリークEVP_EncryptFinal_ex](https://stackoverflow.com/q/18503993/608639)on Stack Overflow 。 – jww

答えて

2

私のLinux x64のマシンでメモリリークに文句を言います。

私は今、このソースを持っていた:

#include <openssl/ssl.h> 
#include <openssl/rsa.h> 
#include <openssl/evp.h> 

int main() { 
    BIGNUM e; 
    BN_init(&e); 
    BN_set_word(&e, 17); 
    RSA *rsa = RSA_new(); 
    RSA_generate_key_ex(rsa, 1024, &e, NULL); 
    EVP_PKEY* pkey = EVP_PKEY_new(); 
    EVP_PKEY_set1_RSA(pkey, rsa); 
    RSA_free(rsa); 
    BN_free(&e); 
    //MINE_COPY_KEY(pkey); // I copy the pkey to other location at here // 
    EVP_PKEY_free(pkey); 
    return 0; 
} 

Valgrindのは言う:プログラムの終了時にCRYPTO_cleanup_all_ex_data();を追加

==18061== 
==18061== LEAK SUMMARY: 
==18061== definitely lost: 0 bytes in 0 blocks 
==18061== indirectly lost: 0 bytes in 0 blocks 
==18061==  possibly lost: 0 bytes in 0 blocks 
==18061== still reachable: 220 bytes in 6 blocks 
==18061==   suppressed: 0 bytes in 0 blocks 
==18061== Reachable blocks (those to which a pointer was found) are not shown. 
==18061== To see them, rerun with: --leak-check=full --show-leak-kinds=all 
==18061== 
==18061== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
==18061== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

==18212== HEAP SUMMARY: 
==18212==  in use at exit: 0 bytes in 0 blocks 
==18212== total heap usage: 457 allocs, 457 frees, 31,748 bytes allocated 
==18212== 
==18212== All heap blocks were freed -- no leaks are possible 
==18212== 
==18212== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
==18212== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

を参照してください:-) Valgringを幸せにします: https://stackoverflow.com/a/21533000/6267288

+0

ねえ、あなたは私のヒーローです!投稿した問題はASNによって検出され、他の問題が原因です。しかしあなたの記事は、迷惑なValgrindの警告を止めるのに役立ちます! –

関連する問題