libfreerdp-core: fix BIO leaks

This commit is contained in:
Marc-André Moreau 2015-02-18 15:36:57 -05:00
parent 2f4a305c67
commit 44d06888bb
7 changed files with 29 additions and 43 deletions

View File

@ -76,6 +76,7 @@ struct rdp_tls
rdpSettings* settings; rdpSettings* settings;
SecPkgContext_Bindings* Bindings; SecPkgContext_Bindings* Bindings;
rdpCertificateStore* certificate_store; rdpCertificateStore* certificate_store;
BIO* underlying;
char* hostname; char* hostname;
int port; int port;
int alertLevel; int alertLevel;

View File

@ -512,12 +512,6 @@ void rpc_in_channel_free(RpcInChannel* inChannel)
inChannel->tls = NULL; inChannel->tls = NULL;
} }
if (inChannel->bio)
{
BIO_free(inChannel->bio);
inChannel->bio = NULL;
}
free(inChannel); free(inChannel);
} }
@ -663,12 +657,6 @@ void rpc_out_channel_free(RpcOutChannel* outChannel)
outChannel->tls = NULL; outChannel->tls = NULL;
} }
if (outChannel->bio)
{
BIO_free(outChannel->bio);
outChannel->bio = NULL;
}
free(outChannel); free(outChannel);
} }

View File

@ -1867,12 +1867,6 @@ void tsg_free(rdpTsg* tsg)
{ {
if (tsg) if (tsg)
{ {
if (tsg->bio)
{
BIO_free(tsg->bio);
tsg->bio = NULL;
}
if (tsg->rpc) if (tsg->rpc)
{ {
rpc_free(tsg->rpc); rpc_free(tsg->rpc);

View File

@ -864,11 +864,11 @@ void nego_process_negotiation_failure(rdpNego* nego, wStream* s)
switch (failureCode) switch (failureCode)
{ {
case SSL_REQUIRED_BY_SERVER: case SSL_REQUIRED_BY_SERVER:
WLog_ERR(TAG, "Error: SSL_REQUIRED_BY_SERVER"); WLog_WARN(TAG, "Error: SSL_REQUIRED_BY_SERVER");
break; break;
case SSL_NOT_ALLOWED_BY_SERVER: case SSL_NOT_ALLOWED_BY_SERVER:
WLog_ERR(TAG, "Error: SSL_NOT_ALLOWED_BY_SERVER"); WLog_WARN(TAG, "Error: SSL_NOT_ALLOWED_BY_SERVER");
nego->sendNegoData = TRUE; nego->sendNegoData = TRUE;
break; break;
@ -882,7 +882,7 @@ void nego_process_negotiation_failure(rdpNego* nego, wStream* s)
break; break;
case HYBRID_REQUIRED_BY_SERVER: case HYBRID_REQUIRED_BY_SERVER:
WLog_ERR(TAG, "Error: HYBRID_REQUIRED_BY_SERVER"); WLog_WARN(TAG, "Error: HYBRID_REQUIRED_BY_SERVER");
break; break;
default: default:

View File

@ -478,7 +478,6 @@ BIO_METHOD* BIO_s_simple_socket(void)
struct _WINPR_BIO_BUFFERED_SOCKET struct _WINPR_BIO_BUFFERED_SOCKET
{ {
BIO* socketBio;
BIO* bufferedBio; BIO* bufferedBio;
BOOL readBlocked; BOOL readBlocked;
BOOL writeBlocked; BOOL writeBlocked;
@ -657,10 +656,10 @@ static int transport_bio_buffered_free(BIO* bio)
{ {
WINPR_BIO_BUFFERED_SOCKET* ptr = (WINPR_BIO_BUFFERED_SOCKET*) bio->ptr; WINPR_BIO_BUFFERED_SOCKET* ptr = (WINPR_BIO_BUFFERED_SOCKET*) bio->ptr;
if (ptr->socketBio) if (bio->next_bio)
{ {
BIO_free(ptr->socketBio); BIO_free(bio->next_bio);
ptr->socketBio = NULL; bio->next_bio = NULL;
} }
ringbuffer_destroy(&ptr->xmitBuffer); ringbuffer_destroy(&ptr->xmitBuffer);

View File

@ -753,24 +753,21 @@ BOOL transport_disconnect(rdpTransport* transport)
transport_stop(transport); transport_stop(transport);
if (transport->tsg) if (transport->tls)
{ {
if (transport->tls) tls_free(transport->tls);
{ transport->tls = NULL;
tls_free(transport->tls);
transport->tls = NULL;
}
tsg_free(transport->tsg);
transport->tsg = NULL;
} }
else else
{ {
if (transport->tls) if (transport->frontBio)
{ BIO_free(transport->frontBio);
tls_free(transport->tls); }
transport->tls = NULL;
} if (transport->tsg)
{
tsg_free(transport->tsg);
transport->tsg = NULL;
} }
transport->frontBio = NULL; transport->frontBio = NULL;

View File

@ -576,9 +576,9 @@ out_free:
#if defined(__APPLE__) #if defined(__APPLE__)
BOOL tls_prepare(rdpTls* tls, BIO *underlying, SSL_METHOD *method, int options, BOOL clientMode) BOOL tls_prepare(rdpTls* tls, BIO* underlying, SSL_METHOD* method, int options, BOOL clientMode)
#else #else
BOOL tls_prepare(rdpTls* tls, BIO *underlying, const SSL_METHOD *method, int options, BOOL clientMode) BOOL tls_prepare(rdpTls* tls, BIO* underlying, const SSL_METHOD* method, int options, BOOL clientMode)
#endif #endif
{ {
rdpSettings* settings = tls->settings; rdpSettings* settings = tls->settings;
@ -614,6 +614,7 @@ BOOL tls_prepare(rdpTls* tls, BIO *underlying, const SSL_METHOD *method, int opt
} }
BIO_push(tls->bio, underlying); BIO_push(tls->bio, underlying);
tls->underlying = underlying;
return TRUE; return TRUE;
} }
@ -721,7 +722,7 @@ out:
return verify_status; return verify_status;
} }
int tls_connect(rdpTls* tls, BIO *underlying) int tls_connect(rdpTls* tls, BIO* underlying)
{ {
int options = 0; int options = 0;
@ -760,7 +761,7 @@ int tls_connect(rdpTls* tls, BIO *underlying)
return tls_do_handshake(tls, TRUE); return tls_do_handshake(tls, TRUE);
} }
BOOL tls_accept(rdpTls* tls, BIO *underlying, const char* cert_file, const char* privatekey_file) BOOL tls_accept(rdpTls* tls, BIO* underlying, const char* cert_file, const char* privatekey_file)
{ {
long options = 0; long options = 0;
@ -1273,6 +1274,12 @@ void tls_free(rdpTls* tls)
tls->bio = NULL; tls->bio = NULL;
} }
if (tls->underlying)
{
BIO_free(tls->underlying);
tls->underlying = NULL;
}
if (tls->PublicKey) if (tls->PublicKey)
{ {
free(tls->PublicKey); free(tls->PublicKey);