Calling OpenSSL_thread_stop() multiple times

Matt Caswell matt at openssl.org
Wed Aug 23 09:33:43 UTC 2023



On 22/08/2023 19:40, Dipak B wrote:
> Not calling Openssl_stop_thread() leads to memory leaks inside 
> ERR_get_error() for me.
> _malloc_base+0x44
> CRYPTO_zalloc+0x54
> ossl_err_get_state_int+0x9E
> ERR_clear_error+0x14
> ossl_send+0x45
> ssl_cf_send+0x36
> Curl_write+0x3C
> Curl_buffer_send+0x11B
> Curl_http_bodysend+0x706
> Curl_http+0xAAA
> multi_runsingle+0x7F4
> curl_multi_perform+0x80
> curl_easy_perform+0x137
> 
> So, can following be supported?
> 
> Communicate.DLL statically linked to ossl 3.x & libcurl 8.x exporting 3 
> functions
> 
> Initialize()
> {
>   SSL_library_init(); or openssl_int_ssl(load no err strings)
> 
> curl_global_init();
> 
> curl_easy_init(); // multiple times generating curl handles to be stored 
> in array of say 16
> }
> 
> Shutdown
> {
> curl_easy_cleanup(); // multiples times for each handle inside array
> 
> Openssl_stop_thread(); // once for each curl handle; so 16 times
> 
> curl_global_cleanup();
> }
> 
> TalkToWeb
> {
> setup_curl_options();
> curl_easy_perform();
> 
> // openssl_stop_thread(); // having this here solves the  memory leak for me
> }
> 
> TalkToWeb() is called by new threads (each invocation is with new 
> thread) created by an executable which loads communicate.DLL
> 
> Execution of above code leads to accumulation of memory until Shutdown() 
> is called.
> 
> Libcurl encourages handle re-use.
> 

I'm not really clear what your asking here. OPENSSL_thread_stop() must 
only be called once per thread, and you cannot use OpenSSL on that 
thread after that point. As long as you obey those rules then you should 
be fine.

Matt


More information about the openssl-users mailing list