On Thu, Jul 03, 2003, Walter Proseilo wrote: > I'm currently using openssl to provide TLS support for our software. We have > our own networking implemtation using the Linux (unix) networking commands. > This deos error handling, buffering, blocking etc. > > The TLS implimentation uses the networking implimentation to communicate with > remote hosts. It does not have direct access to the socket (fd) so it uses a > bio pair to send data to and from the network implimentation. > > We have our own memory management and tracking library which we have hooked > into open ssl. When the a program is shutting down our memory will display > the memory leaked and stack trace for its allocation. Using this I have > found two memory leaks for every connection that I can't seem to clean up. > This was observed in 0.9.7a and 0.9.7b versions of openssl. > > //the code for creation of the ssl object is as follows. > ConnectionInfo->ssl = SSL_new(ctx); > > //create BIO pair > size_t bufsize = BIOPAIRBUFFSIZE; > BIO_new_bio_pair(&(ConnectionInfo->internal_IO), bufsize, > &(ConnectionInfo->external_IO), bufsize) > > //set input/output BIOs for ssl object > SSL_set_bio(ConnectionInfo->ssl, > ConnectionInfo->internal_IO, > ConnectionInfo->internal_IO); > > //set connect/accept state > if(ConnectionInfo->isserver == true) > { > SSL_set_accept_state(ConnectionInfo->ssl); > } > else > { > SSL_set_connect_state(ConnectionInfo->ssl); > } > > //start handshake > int ret = SSL_do_handshake(ConnectionInfo->ssl); > > The code for clean up of the object after shutdown has been sent and recivied > is as follows. > > //free SSL structures > SSL_free(conninfo->ssl); > BIO_free(conninfo->external_IO); > > >From reading the documentation all other structures and memory should be > implicitly cleaned up when I free the ssl object. > > One leak has to do with the bio pair. Both bios in the pair are deallocated > when the TLS interaction is complete. The implimentation is the same as that > described in the example on man page for BIO_new_bio_pair. > > Stack trace is as follows. > > //our memory allocator > (mymalloc__FUi+0x1e) [0x80b2c5a] > [0x8104b76] > (CRYPTO_malloc+0x6d) [0x81050e5] > (sk_new+0x3d) [0x8112311] > (sk_new_null+0x10) [0x81122c4] > [0x8106771] > [0x8106a5e] > (CRYPTO_new_ex_data+0x2e) [0x810718a] > (BIO_set+0xa6) [0x810ba4a] > (BIO_new+0x56) [0x810b976] > (BIO_new_bio_pair+0x2b) [0x8111e27] > //Our program stack > > The second memory leak is in the handshake. It is usually 16 bytes in size. > stack trace is as follows. > > //our memory allocator > (mymalloc__FUi+0x1e) [0x80b2c5a] > [0x8104b76] > (CRYPTO_malloc+0x6d) [0x81050e5] > (sk_new+0x3d) [0x8112311] > (sk_new_null+0x10) [0x81122c4] > [0x8106771] > [0x8106a5e] > (CRYPTO_new_ex_data+0x2e) [0x810718a] > (SSL_SESSION_new+0xdf) [0x80f0533] > (ssl_get_new_session+0x1a) [0x80f05c6] > [0x80fbe1f] > (ssl3_connect+0x406) [0x80fb60a] > (SSL_do_handshake+0x9f) [0x80ee3f3] > //Our program stack > > Is there any way to clean up these memory leaks? Is there something that I > missed or forgot to do? > > In addition there are a number of onetime initilization memory leaks. They > all appear to be data that is associated with the ctxs when they are > initilized. Certtificates, Certificate authorities and Private Keys. Each > ctx is freed at during cleanup before the program completes. >
The way I normally trace this stuff is to run it under a debugger first to get the addresses of leaks then a second time with conditional breakpoints added at those points so that when that same address is allocated it is possible to do a stack trace to see the precise cause. That ex_data leak may mean you aren't calling CRYPTO_cleanup_all_ex_data(). Steve. -- Dr Stephen N. Henson. Core developer of the OpenSSL project: http://www.openssl.org/ Freelance consultant see: http://www.drh-consultancy.demon.co.uk/ Email: [EMAIL PROTECTED], PGP key: via homepage. ______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]