OpenSSL::SSL_library_init() memory leak

2019-01-11 11:00发布

Recently I have started studying about memory leaks in C++, so I may ask a naive questions.
I have a c++ library that is using OpenSSL - my task is to check if there are memory leaks in this lib. I have run Visual Leak Detector to check mem leaks.
I see that the calls to SSL_library_init(); and SSL_load_error_strings(); are leading leak - quick googling is showing that at the end of usage I have to call the followings:

CONF_modules_free();
ERR_remove_state(0);
ENGINE_cleanup();
CONF_modules_unload(1);
ERR_free_strings();
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();

The leak indeed decreased, but still there are two leaks(that the VLD tool shows me) that happen because the SSL_library_init call.
does anyone know what else I have to do in order to free all the mem leaks?

4条回答
虎瘦雄心在
2楼-- · 2019-01-11 11:41

To get rid of the final two memory blocks allocated in SSL_library_init() try:

sk_free(SSL_COMP_get_compression_methods());
查看更多
Explosion°爆炸
3楼-- · 2019-01-11 11:42

To get rid of compilation error in Joe H's answer:

sk_SSL_COMP_free(SSL_COMP_get_compression_methods());
查看更多
祖国的老花朵
4楼-- · 2019-01-11 11:48

As I understand all the memory which is allocated during SSL_library_init() and SSL_load_error_strings() are stored in global variables and so it comes under the category of "Memory in Use" rather under the category of Memory leak as the memory is still accessible when the program is dying out.

One suggestion is that ERR_remove_state(0) must be called in each thread where SSL is used, because when you call the ERR_remove_state with argument 0, it just clears the error state for the current thread. Other calls appears good to me. If you could post, "two leaks" which are still being displayed by VLD, I can check.

查看更多
Summer. ? 凉城
5楼-- · 2019-01-11 11:50

Call SSL_COMP_free_compression_methods();.

查看更多
登录 后发表回答