ZTMSブログ

自作フリーソフトやプログラミング雑記

 >  Win32 >  アプリ終了時のOpenSSLメモリ解放

アプリ終了時のOpenSSLメモリ解放

自分のコードがメモリリーク(解放漏れ)していないか調べようと、Visual C++ でアプリケーション終了時に解放されていないメモリ領域を教えてくれるデバッグ用の関数 _CrtSetDbgFlag を使ってみたら、ものすごい大量のリーク領域が報告された。なんだこりゃ?いったい何事か??と思ったら、どうやらOpenSSLの中でメモリ解放されていないもよう。

そういえばOpenSSLは SSL_library_init 関数で初期化(利用開始)するが、対応する終了用の関数がない。ヒドス・・・。
ググっていろいろ試して、SSL_library_init に対応する終了関数はこんな感じで、いちおうちゃんと解放されるようになった・・のかな・・?
#include "openssl/conf.h"
#include "openssl/engine.h"
void SSL_library_fin( void )
{
ENGINE_cleanup();
CONF_modules_unload(1);
ERR_free_strings();
CRYPTO_cleanup_all_ex_data();
EVP_cleanup();
ERR_remove_state(0);
sk_SSL_COMP_free(SSL_COMP_get_compression_methods());
}

これでやっと自分のコードが解放漏れしてないか、_CrtSetDbgFlag で調べられる。。
* by ADMIS
valgrindでメモリリークを探していたら、まさかのOpenSSL……。OpenSSLはSSL_readがハングアップするなど、非常に手間取らせられていました。見ず知らずではありますが、素晴らしいコードをありがとうございます。非常に助かりました。

* by ZTMS
コメントありがとうございます。OpenSSLは確かに、何かの条件で挙動が不安定になり、よくわからないまま何となく回避できた?ような事がちょこちょこある印象です。もうすこし安定感があるとうれしいですね。。

コメント






管理者にだけ表示を許可する

valgrindでメモリリークを探していたら、まさかのOpenSSL……。OpenSSLはSSL_readがハングアップするなど、非常に手間取らせられていました。見ず知らずではありますが、素晴らしいコードをありがとうございます。非常に助かりました。
2015-08-09 * ADMIS [ 編集 ]

コメントありがとうございます。OpenSSLは確かに、何かの条件で挙動が不安定になり、よくわからないまま何となく回避できた?ような事がちょこちょこある印象です。もうすこし安定感があるとうれしいですね。。
2015-08-09 * ZTMS [ 編集 ]