diff --git a/libfreerdp/core/gateway/rdg.c b/libfreerdp/core/gateway/rdg.c index 67eefa723..8dd765a66 100644 --- a/libfreerdp/core/gateway/rdg.c +++ b/libfreerdp/core/gateway/rdg.c @@ -108,6 +108,7 @@ struct rdp_rdg { rdpContext* context; rdpSettings* settings; + BOOL attached; BIO* frontBio; rdpTls* tlsIn; rdpTls* tlsOut; @@ -1544,15 +1545,19 @@ void rdg_free(rdpRdg* rdg) tls_free(rdg->tlsIn); http_context_free(rdg->http); ntlm_free(rdg->ntlm); - BIO_free_all(rdg->frontBio); + + if (!rdg->attached) + BIO_free_all(rdg->frontBio); + DeleteCriticalSection(&rdg->writeSection); free(rdg); } -BIO* rdg_front_bio(rdpRdg* rdg) +BIO* rdg_get_front_bio_and_take_ownership(rdpRdg* rdg) { if (!rdg) return NULL; + rdg->attached = TRUE; return rdg->frontBio; } diff --git a/libfreerdp/core/gateway/rdg.h b/libfreerdp/core/gateway/rdg.h index b6702201b..0b69a87c8 100755 --- a/libfreerdp/core/gateway/rdg.h +++ b/libfreerdp/core/gateway/rdg.h @@ -43,7 +43,7 @@ typedef struct rdp_rdg rdpRdg; FREERDP_LOCAL rdpRdg* rdg_new(rdpContext* context); FREERDP_LOCAL void rdg_free(rdpRdg* rdg); -FREERDP_LOCAL BIO* rdg_front_bio(rdpRdg* rdg); +FREERDP_LOCAL BIO* rdg_get_front_bio_and_take_ownership(rdpRdg* rdg); FREERDP_LOCAL BOOL rdg_connect(rdpRdg* rdg, int timeout, BOOL* rpcFallback); FREERDP_LOCAL DWORD rdg_get_event_handles(rdpRdg* rdg, HANDLE* events, diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index c9d12401f..14c6fe2a0 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -378,7 +378,7 @@ BOOL transport_connect(rdpTransport* transport, const char* hostname, if (status) { - transport->frontBio = rdg_front_bio(transport->rdg); + transport->frontBio = rdg_get_front_bio_and_take_ownership(transport->rdg); BIO_set_nonblock(transport->frontBio, 0); transport->layer = TRANSPORT_LAYER_TSG; status = TRUE; @@ -1093,9 +1093,6 @@ BOOL transport_disconnect(rdpTransport* transport) if (!transport) return FALSE; - if (transport->rdg && (rdg_front_bio(transport->rdg) == transport->frontBio)) - transport->frontBio = NULL; - if (transport->tls) { tls_free(transport->tls);