[openssl.org #4704] Memory leak in rsa_new/rsa_free

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[openssl.org #4704] Memory leak in rsa_new/rsa_free

Rich Salz via RT
Hi,


I'm writing a c++ server application that calls thounsands of times per
hour the rsa_new()
and rsa_free() openssl functions.

After debugging a lot I discovered that "sometimes" (I'm not able to
tell a precise number) the rsa_free
does not release properly the memory allocated by the rsa_new.
In order to prove this I created the simple program below. If i run it,
i see the related working set
going bigger and bigger, 4KB per second.

I'm using the 1.0.2.8 version of libeay32.dll and ssleay32.ddl under
windows 7 64 bit.

It this a known bug? I'm forgetting something?

Thanks in advance

Simone Sgualdini
Italy


//---------------------------------------------------------------------------

#include <vcl.h>


#ifdef _cplusplus
extern "C"
   {
#endif
     #include <openssl/rand.h>
     #include <openssl/ssl.h>
     #include <openssl/err.h>
       #include <openssl/rsa.h>
       #include <openssl/bn.h>
#ifdef _cplusplus
   }
#endif
#pragma hdrstop

HMODULE libeay32DLL = NULL;
HMODULE ssleay32DLL = NULL;

typedef RSA      *    (CALLBACK *myRSA_new) (void);
typedef void          (CALLBACK *myRSA_free) (RSA *r);
typedef int           (CALLBACK *mySSL_library_init) (void);

    myRSA_new                _RSA_new                = NULL;
    myRSA_free               _RSA_free               = NULL;
    mySSL_library_init       _SSL_library_init;

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])
{
   RSA           *rsa;
   unsigned long count = 0;

   libeay32DLL = LoadLibrary("libeay32.dll");
   ssleay32DLL = LoadLibrary("ssleay32.dll");

   if(libeay32DLL && ssleay32DLL)
     {
       _RSA_new                = (myRSA_new)
GetProcAddress(libeay32DLL,"RSA_new");
       _RSA_free               = (myRSA_free)
GetProcAddress(libeay32DLL,"RSA_free");
       _SSL_library_init       = (mySSL_library_init)
GetProcAddress(ssleay32DLL,"SSL_library_init");
     }

   _SSL_library_init();

   while(1)
      {

       if(++count %100 == 0)  // whitout this, I get a stack overflow
immediately
          Sleep(1);

*_RSA_free(_RSA_new());*
     }

   return 0;
}


--
Ticket here: http://rt.openssl.org/Ticket/Display.html?id=4704
Please log in as guest with password guest if prompted

--
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev
Reply | Threaded
Open this post in threaded view
|

Re: [openssl.org #4704] Memory leak in rsa_new/rsa_free

Martin Simmons
I think your problem (and the stack overflow) is caused by using "CALLBACK" in
the 3 function typedefs.  Try using __cdecl instead of CALLBACK.

__Martin


>>>>> On Tue, 11 Oct 2016 16:15:24 +0000, Simone Sgualdini via RT said:
>
>
> Hi,
>
>
> I'm writing a c++ server application that calls thounsands of times per
> hour the rsa_new()
> and rsa_free() openssl functions.
>
> After debugging a lot I discovered that "sometimes" (I'm not able to
> tell a precise number) the rsa_free
> does not release properly the memory allocated by the rsa_new.
> In order to prove this I created the simple program below. If i run it,
> i see the related working set
> going bigger and bigger, 4KB per second.
>
> I'm using the 1.0.2.8 version of libeay32.dll and ssleay32.ddl under
> windows 7 64 bit.
>
> It this a known bug? I'm forgetting something?
>
> Thanks in advance
>
> Simone Sgualdini
> Italy
>
>
> //---------------------------------------------------------------------------
>
> #include <vcl.h>
>
>
> #ifdef _cplusplus
> extern "C"
>    {
> #endif
>      #include <openssl/rand.h>
>      #include <openssl/ssl.h>
>      #include <openssl/err.h>
>        #include <openssl/rsa.h>
>        #include <openssl/bn.h>
> #ifdef _cplusplus
>    }
> #endif
> #pragma hdrstop
>
> HMODULE libeay32DLL = NULL;
> HMODULE ssleay32DLL = NULL;
>
> typedef RSA      *    (CALLBACK *myRSA_new) (void);
> typedef void          (CALLBACK *myRSA_free) (RSA *r);
> typedef int           (CALLBACK *mySSL_library_init) (void);
>
>     myRSA_new                _RSA_new                = NULL;
>     myRSA_free               _RSA_free               = NULL;
>     mySSL_library_init       _SSL_library_init;
>
> //---------------------------------------------------------------------------
>
> #pragma argsused
>
> int main(int argc, char* argv[])
> {
>    RSA           *rsa;
>    unsigned long count = 0;
>
>    libeay32DLL = LoadLibrary("libeay32.dll");
>    ssleay32DLL = LoadLibrary("ssleay32.dll");
>
>    if(libeay32DLL && ssleay32DLL)
>      {
>        _RSA_new                = (myRSA_new)
> GetProcAddress(libeay32DLL,"RSA_new");
>        _RSA_free               = (myRSA_free)
> GetProcAddress(libeay32DLL,"RSA_free");
>        _SSL_library_init       = (mySSL_library_init)
> GetProcAddress(ssleay32DLL,"SSL_library_init");
>      }
>
>    _SSL_library_init();
>
>    while(1)
>       {
>
>        if(++count %100 == 0)  // whitout this, I get a stack overflow
> immediately
>           Sleep(1);
>
> *_RSA_free(_RSA_new());*
>      }
>
>    return 0;
> }
>
>
> --
> Ticket here: http://rt.openssl.org/Ticket/Display.html?id=4704
> Please log in as guest with password guest if prompted
>
> --
> openssl-dev mailing list
> To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev
>
--
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev