> Sileno de Oliveira Brito via curl-library <[email protected]> hat am 
> 6. Dezember 2018 um 14:40 geschrieben:
> 
> 
> How to solve the memory leak question when use the libcurl?
> in my main i have in line 33 the call
> 
OpenSSL is one of the culprits, which does not do proper cleanup at the 
programs end. Their attitude has been, that they run until the very end of the 
programs life, why free everything if the whole heap is disposed of anyway?

While this is true for the purpose of the program itself, it screws over 
everyone who uses a library like that and intends to use a tool like valgrind 
or VLD or something like that.

We ran into this issue 10 years ago and i went and looked if there was 
something i could do to get OpenSSL to do a cleaner, if not absolutely 
pristine, cleanup.

This is what i came up with:

#include <openssl/conf.h>
#include <openssl/engine.h>
#include <openssl/crypto.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

/* 
-----------------------------------------------------------------------------------------------------------------------------
 * @Function: CleanupSSLLibrary
 * @Info    : Does all known cleanup for the OpenSSL library to get its memory 
freed. OpenSSL itself doesnt seem to have any
 *            severe memory leaks, but it doesnt seem to have any global 
shutdown routine that frees all reserved memory either.
 *            So we try our best here to free as much as possible. Once the 
program is terminated it doesnt matter anyway. The
 *            output of automated leak detection utilities however will report 
unfreed memory blocks because of this.
 * 
-----------------------------------------------------------------------------------------------------------------------------
 */
void CleanupSSLLibrary(void)
{
  int i, iNumOfLocks = CRYPTO_num_locks();

  if (l_pLockHandlesSSL != NULL){
    CRYPTO_set_locking_callback(NULL);

    for (i=0; i < iNumOfLocks; i++) CloseHandle(l_pLockHandlesSSL[i]);

    OPENSSL_free(l_pLockHandlesSSL);
    l_pLockHandlesSSL = NULL;
  }

  ENGINE_cleanup();
  CONF_modules_unload(1);

  /* global application exit cleanup (after all SSL activity is shutdown) */
  ERR_free_strings();
  EVP_cleanup();
  CRYPTO_cleanup_all_ex_data();
}

The includes may not be in the necessary order. This is Windows code, you will 
need another include for "Closehandle" or an equivalent method.

The 1st part deals with freeing the multithreading locks you need for crashless 
multithreaded operation with OpenSSL. If you did not allocate them you do not 
need clean them up. Also if you did not allocate them, do not use OpenSSL in a 
multithreaded fashion!

The 5 calls below should free all but 2 memory buffers that OpenSSL allocates. 
IIRC ERR_free_strings() needs to be called in each thread that used the error 
handling of OpenSSL.

Maybe this helps someone, maybe OpenSSL got its act together in the past 
decade. I do not think it will hurt presenting this here.

Greetings,
  Michael König

-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette:   https://curl.haxx.se/mail/etiquette.html

Reply via email to