diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 371f56201..9e13a8fe3 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -391,7 +391,9 @@ BOOL rdp_client_disconnect(rdpRdp* rdp) if (!nego_disconnect(rdp->nego)) return FALSE; - rdp_reset(rdp); + if (!rdp_reset(rdp)) + return FALSE; + rdp_client_transition_to_state(rdp, CONNECTION_STATE_INITIAL); if (freerdp_channels_disconnect(context->channels, context->instance) != CHANNEL_RC_OK) diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index 6eb670d51..289aa8c15 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -1894,7 +1894,7 @@ fail: return NULL; } -void rdp_reset(rdpRdp* rdp) +BOOL rdp_reset(rdpRdp* rdp) { rdpContext* context; rdpSettings* settings; @@ -1950,17 +1950,24 @@ void rdp_reset(rdpRdp* rdp) license_free(rdp->license); transport_free(rdp->transport); fastpath_free(rdp->fastpath); + rdp->transport = transport_new(context); - if (rdp->io && rdp->transport) - transport_set_io_callbacks(rdp->transport, rdp->io); + if (rdp->transport) + { + if (rdp->io) + transport_set_io_callbacks(rdp->transport, rdp->io); + + rdp->nego = nego_new(rdp->transport); + rdp->mcs = mcs_new(rdp->transport); + transport_set_layer(rdp->transport, TRANSPORT_LAYER_TCP); + } rdp->license = license_new(rdp); - rdp->nego = nego_new(rdp->transport); - rdp->mcs = mcs_new(rdp->transport); rdp->fastpath = fastpath_new(rdp); - transport_set_layer(rdp->transport, TRANSPORT_LAYER_TCP); rdp->errorInfo = 0; rdp->deactivation_reactivation = 0; rdp->finalize_sc_pdus = 0; + + return rdp->transport && rdp->nego && rdp->mcs && rdp->fastpath && rdp->license; } /** diff --git a/libfreerdp/core/rdp.h b/libfreerdp/core/rdp.h index 9430e16b4..b4e46cadb 100644 --- a/libfreerdp/core/rdp.h +++ b/libfreerdp/core/rdp.h @@ -224,7 +224,7 @@ FREERDP_LOCAL int rdp_recv_callback(rdpTransport* transport, wStream* s, void* e FREERDP_LOCAL int rdp_check_fds(rdpRdp* rdp); FREERDP_LOCAL rdpRdp* rdp_new(rdpContext* context); -FREERDP_LOCAL void rdp_reset(rdpRdp* rdp); +FREERDP_LOCAL BOOL rdp_reset(rdpRdp* rdp); FREERDP_LOCAL void rdp_free(rdpRdp* rdp); FREERDP_LOCAL const rdpTransportIo* rdp_get_io_callbacks(rdpRdp* rdp);