memory still reachable post calling SSL_CTX_free

Tomas Mraz tomas at openssl.org
Tue Jun 21 10:42:30 UTC 2022


On Tue, 2022-06-21 at 10:33 +0000, Tiwari, Hari Sahaya wrote:
> Hi,
> I need one clarification on routine SSL_CTX_free(). I see the memory
> is not freed even after calling this SSL_CTX_free().
>  
> I have a simple test program, which just does SSL_CTX_new() and 
> SSL_CTX_free().
>  
> #include<stdio.h>
> #include <openssl/ssl.h>
>  
> int main()
> {
>     const SSL_METHOD *method;
>     SSL_CTX *ctx = NULL;
>     OPENSSL_init_ssl(0, NULL);
>     method = TLS_method();
>     ctx = SSL_CTX_new(method);
>     if ( ctx == NULL ) {
>         return(-1);
>     }
>     SSL_CTX_free(ctx);
>     ctx=NULL;
>     sleep(300);

sleep() won't help you at all as there is no concurrent thread running
or anything else that would remove things for you when the process is
sleeping.

> }
>  
> If the program is terminated after it enters the sleep, I am seeing
> memory is still reachable in valgrind.
>  
> Here is output from valgrind,
>  
> ==443000== 10,224 bytes in 426 blocks are still reachable in loss
> record 593 of 594
> ==443000==    at 0x4C34F0B: malloc (vg_replace_malloc.c:307)
> ==443000==    by 0x525D775: OPENSSL_LH_insert (in
> /usr/lib64/libcrypto.so.1.1.1g)
> ==443000==    by 0x522DDB2: ??? (in /usr/lib64/libcrypto.so.1.1.1g)
> ==443000==    by 0x522E1CF: ERR_load_strings_const (in
> /usr/lib64/libcrypto.so.1.1.1g)
> ==443000==    by 0x4E79083: ERR_load_SSL_strings (in
> /usr/lib64/libssl.so.1.1.1g)
> ==443000==    by 0x4E790BC: ??? (in /usr/lib64/libssl.so.1.1.1g)
> ==443000==    by 0x5DABCD6: __pthread_once_slow (in
> /usr/lib64/libpthread-2.28.so)
> ==443000==    by 0x52C4ADC: CRYPTO_THREAD_run_once (in
> /usr/lib64/libcrypto.so.1.1.1g)
> ==443000==    by 0x4E794FA: OPENSSL_init_ssl (in
> /usr/lib64/libssl.so.1.1.1g)
> ==443000==    by 0x4E7D371: SSL_CTX_new (in
> /usr/lib64/libssl.so.1.1.1g)
> ==443000==    by 0x400749: main (in /home/hari/a.out)
> 

This is actually not a memory allocated by the SSL_CTX_new() itself but
error string data that is global. There is no real memory leak here.
You can call OPENSSL_cleanup() to explicitly de-allocate all the global
data however please note that you can do it really only before
immediate exit of the application using OpenSSL otherwise you risk
crashes if something tries to call OpenSSL again after
OPENSSL_cleanup() was called.

> SSL_CTX_free is already called before sleep(), but memory is still
> hanging around.
> Is there something I am missing here? Do I need to follow some other
> steps ?
> This memory leak is impacting our long term running processes, which
> allocate and free context.

This should not be the case as this memory should be allocated only
once. If you, in your test code, do SSL_CTX_new/SSL_CTX_free in a loop
you should still see just the same memory leaked and not more blocks.

-- 
Tomáš Mráz, OpenSSL



More information about the openssl-users mailing list