[openssl-users] Handle Leaks - shmem-win32.c shmem.c - OpenSSL 1.0.1l
Avery A. Tarasov
Avery.A.Tarasov at SecurityEngineer.Pro
Thu Jan 22 23:58:53 UTC 2015
I have a fairly simple Win32 application (.cpp file source code
attached) that uses OpenSSL 1.0.1l to send some GET requests in 2
threads. I am getting reports of Handle Leaks in C++ memory validator
(see logs at bottom of email), but I can't find what is wrong with my
code (if anything). The app appears to function perfectly and the
memory doesn't appear to rise in task manager.. but I'm still worried
about the Handle Leak reports.
* It should be noted that even if I get rid of the threads all together
and just call 2 functions for the GET requests, I still get these same
leak reports. So I don't think its a thread related problem.
Also, the reason I'm not using CRYPTO_set_locking_callback is because I
am already using WaitForSingleObject and ReleaseMutex to make sure its
impossible for two threads to be running at the same time. Unless I'm
missing something, CRYPTO_set_locking_callback is not needed due to the
way I coded this.
Can someone please verify if the code is thread safe, and comment
regarding what might be causing these handle leaks? Maybe it is nothing
to be worried about -- not sure..
Are there any other problems you see in the code? Perhaps missing
cleanup functions? Or is everything OK and I'm just over analyzing this?
Thanks for any tips!
Best Regards,
-Avery
Address / Handle: 0x0000C001
shmem-win32.c
sslleak.exe
Atom
0 bytes
Thread ID: 6736
1/22 18:48:09 990ms (Lifetime:00:01:45:503ms)
Sequence: 11
sslleak.exe ___shmem_grab : [shmem-win32.c Line 0]
sslleak.exe _fc_key_init_once : [unwind-sjlj.c Line 0]
sslleak.exe _main : [crt0_c.c Line 0]
sslleak.exe ___tmainCRTStartup : [crtexe.c Line 0]
kernel32.dll BaseThreadInitThunk : [{FUNC}BaseThreadInitThunk Line 0]
ntdll.dll RtlInitializeExceptionChain :
[{FUNC}RtlInitializeExceptionChain Line 0]
Address / Handle: 0x0000C00F
shmem-win32.c
sslleak.exe
Atom
0 bytes
Thread ID: 6736
1/22 18:48:09 990ms (Lifetime:00:02:29:683ms)
Sequence: 97
sslleak.exe ___shmem_grab : [shmem-win32.c Line 0]
sslleak.exe ___shmem_grab : [shmem-win32.c Line 0]
Address / Handle: 0x0000C016
shmem.c
sslleak.exe
Atom
0 bytes
Thread ID: 6736
1/22 18:48:09 990ms (Lifetime:00:03:02:693ms)
Sequence: 143
sslleak.exe ___shmem_winpthreads_grab : [shmem.c Line 0]
sslleak.exe ___shmem_winpthreads_grab : [shmem.c Line 0]
sslleak.exe ___shmem_winpthreads_grab : [shmem.c Line 0]
sslleak.exe ___shmem_winpthreads_grab : [shmem.c Line 0]
sslleak.exe ___shmem_winpthreads_grab : [shmem.c Line 0]
sslleak.exe ___shmem_winpthreads_grab : [shmem.c Line 0]
Address / Handle: 0x0000C009
shmem.c
sslleak.exe
Atom
0 bytes
Thread ID: 6736
1/22 18:48:09 990ms (Lifetime:00:03:22:364ms)
Sequence: 61
sslleak.exe ___shmem_winpthreads_grab : [shmem.c Line 0]
sslleak.exe _mutex_static_init : [mutex.c Line 0]
sslleak.exe _pop_pthread_mem : [thread.c Line 0]
sslleak.exe _pop_pthread_mem : [thread.c Line 0]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mta.openssl.org/pipermail/openssl-users/attachments/20150122/7ec1188f/attachment.html>
-------------- next part --------------
#include <windows.h>
#include <stdio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/engine.h>
#include <openssl/conf.h>
#include <winsock.h>
#include <string>
HANDLE sslmutex=0;
int checks(X509_STORE_CTX *c, void *v)
{
return 1;
}
void SSLGO_111()
{
SSL_CTX *myct;
myct = SSL_CTX_new(TLSv1_2_method());
if(myct==NULL)
{
ERR_remove_state(0);
return;
}
SSL_CTX_set_verify(myct,SSL_VERIFY_PEER, NULL);
SSL_CTX_set_cert_verify_callback(myct, checks, "K");
std::string http_resp;
std::string headers="GET /111 HTTP/1.1\r\nHost: removed.com\r\nAccept: */*\r\nUser-Agent: Test\r\n\r\n";
X509 *pcc=0;
SSL *thessl=0;
BIO *bcc = NULL;
char buf[513];
int ret;
bcc = BIO_new_connect("removed.com:443");
if (!bcc)
{
goto sslend;
}
if (BIO_do_connect(bcc)<=0)
{
goto sslend;
}
thessl=SSL_new(myct);
if (!thessl )
{
goto sslend;
}
SSL_set_bio(thessl, bcc, bcc);
if (SSL_connect(thessl)<=0)
{
goto sslend;
}
pcc=SSL_get_peer_certificate(thessl);
if(pcc==NULL)
{
goto sslend;
}
ret=SSL_write(thessl, headers.c_str(),headers.length());
if(ret<0)
{
goto sslend;
}
while(1)
{
memset(buf,0x0,sizeof(buf));
int r=SSL_read(thessl,buf,512);
switch(SSL_get_error(thessl,r))
{
case SSL_ERROR_SYSCALL:
goto sslend;
case SSL_ERROR_ZERO_RETURN:
goto sslend;
case SSL_ERROR_NONE:
http_resp+=buf;
break;
default:
;
}
}
sslend:
if(pcc)
{
X509_free(pcc);
}
if (thessl)
{
SSL_shutdown(thessl);
SSL_free(thessl);
}
else
if (bcc)
{
BIO_free(bcc);
}
if(myct)
{
SSL_CTX_free(myct);
}
ERR_remove_state(0);
}
void SSLGO_222()
{
SSL_CTX *myct;
myct = SSL_CTX_new(TLSv1_2_method());
if(myct==NULL)
{
ERR_remove_state(0);
return;
}
SSL_CTX_set_verify(myct,SSL_VERIFY_PEER, NULL);
SSL_CTX_set_cert_verify_callback(myct, checks, "K");
std::string http_resp;
std::string headers="GET /222 HTTP/1.1\r\nHost: removed.com\r\nAccept: */*\r\nUser-Agent: Test\r\n\r\n";
X509 *pcc=0;
SSL *thessl=0;
BIO *bcc = NULL;
char buf[513];
int ret;
bcc = BIO_new_connect("removed.com:443");
if (!bcc)
{
goto sslend;
}
if (BIO_do_connect(bcc)<=0)
{
goto sslend;
}
thessl=SSL_new(myct);
if (!thessl )
{
goto sslend;
}
SSL_set_bio(thessl, bcc, bcc);
if (SSL_connect(thessl)<=0)
{
goto sslend;
}
pcc=SSL_get_peer_certificate(thessl);
if(pcc==NULL)
{
goto sslend;
}
ret=SSL_write(thessl, headers.c_str(),headers.length());
if(ret<0)
{
goto sslend;
}
while(1)
{
memset(buf,0x0,sizeof(buf));
int r=SSL_read(thessl,buf,512);
switch(SSL_get_error(thessl,r))
{
case SSL_ERROR_SYSCALL:
goto sslend;
case SSL_ERROR_ZERO_RETURN:
goto sslend;
case SSL_ERROR_NONE:
http_resp+=buf;
break;
default:
;
}
}
sslend:
if(pcc)
{
X509_free(pcc);
}
if (thessl)
{
SSL_shutdown(thessl);
SSL_free(thessl);
}
else
if (bcc)
{
BIO_free(bcc);
}
if(myct)
{
SSL_CTX_free(myct);
}
ERR_remove_state(0);
}
DWORD __stdcall thread1(LPVOID l)
{
while(1)
{
WaitForSingleObject(sslmutex,INFINITE);
SSLGO_222();
ReleaseMutex(sslmutex);
Sleep(100);
}
}
DWORD __stdcall thread2(LPVOID l)
{
while(1)
{
WaitForSingleObject(sslmutex,INFINITE);
SSLGO_111();
ReleaseMutex(sslmutex);
Sleep(100);
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
DWORD t1;
DWORD t2;
sslmutex=CreateMutex(NULL,false,NULL);
if(sslmutex==NULL)
{
return 0;
}
SSL_library_init();
SSL_load_error_strings();
HANDLE h1=0;
HANDLE h2=0;
h1=CreateThread(0,0,thread1,0,0,&t1);
if(h1==0)
{
return 0;
}
h2=CreateThread(0,0,thread2,0,0,&t1);
if(h2==0)
{
return 0;
}
while(1)
{
Sleep(1000);
}
// IMPORTANT ******************
// Even if I do this and comment out the 2 CreateThreads above, I still get the same Handle Leak reports... so it doesn't appear to be anything relate to
// a thread problem
/*
while(1)
{
SSLGO_111();
SSLGO_222();
Sleep(1000);
}
*/
}
More information about the openssl-users
mailing list