diff --git a/channels/cliprdr/client/cliprdr_main.c b/channels/cliprdr/client/cliprdr_main.c index d6fae48c6..bce4996e8 100644 --- a/channels/cliprdr/client/cliprdr_main.c +++ b/channels/cliprdr/client/cliprdr_main.c @@ -1043,7 +1043,6 @@ static VOID VCAPITYPE cliprdr_virtual_channel_open_event_ex(LPVOID lpUserParam, break; case CHANNEL_EVENT_WRITE_COMPLETE: - Stream_Free((wStream*) pData, TRUE); break; case CHANNEL_EVENT_USER: diff --git a/channels/drdynvc/client/drdynvc_main.c b/channels/drdynvc/client/drdynvc_main.c index 9bb17f7d7..8dd0a353b 100644 --- a/channels/drdynvc/client/drdynvc_main.c +++ b/channels/drdynvc/client/drdynvc_main.c @@ -1207,7 +1207,6 @@ static void VCAPITYPE drdynvc_virtual_channel_open_event_ex(LPVOID lpUserParam, if (!drdynvc || (drdynvc->OpenHandle != openHandle)) { WLog_ERR(TAG, "drdynvc_virtual_channel_open_event: error no match"); - Stream_Free((wStream*) pData, TRUE); return; } @@ -1222,7 +1221,6 @@ static void VCAPITYPE drdynvc_virtual_channel_open_event_ex(LPVOID lpUserParam, break; case CHANNEL_EVENT_WRITE_COMPLETE: - Stream_Free((wStream*) pData, TRUE); break; case CHANNEL_EVENT_USER: diff --git a/channels/encomsp/client/encomsp_main.c b/channels/encomsp/client/encomsp_main.c index b9d6b947b..5cc462f57 100644 --- a/channels/encomsp/client/encomsp_main.c +++ b/channels/encomsp/client/encomsp_main.c @@ -998,7 +998,6 @@ static VOID VCAPITYPE encomsp_virtual_channel_open_event_ex(LPVOID lpUserParam, break; case CHANNEL_EVENT_WRITE_COMPLETE: - Stream_Free((wStream*) pData, TRUE); break; case CHANNEL_EVENT_USER: diff --git a/channels/rail/client/rail_main.c b/channels/rail/client/rail_main.c index 1b259d620..71761f903 100644 --- a/channels/rail/client/rail_main.c +++ b/channels/rail/client/rail_main.c @@ -680,7 +680,6 @@ static VOID VCAPITYPE rail_virtual_channel_open_event_ex(LPVOID lpUserParam, DWO break; case CHANNEL_EVENT_WRITE_COMPLETE: - Stream_Free((wStream*) pData, TRUE); break; case CHANNEL_EVENT_USER: diff --git a/channels/rdpdr/client/rdpdr_main.c b/channels/rdpdr/client/rdpdr_main.c index 67af4774c..92dbb6e08 100644 --- a/channels/rdpdr/client/rdpdr_main.c +++ b/channels/rdpdr/client/rdpdr_main.c @@ -1609,7 +1609,6 @@ static VOID VCAPITYPE rdpdr_virtual_channel_open_event_ex(LPVOID lpUserParam, DW break; case CHANNEL_EVENT_WRITE_COMPLETE: - Stream_Free((wStream*) pData, TRUE); break; case CHANNEL_EVENT_USER: diff --git a/channels/rdpsnd/client/rdpsnd_main.c b/channels/rdpsnd/client/rdpsnd_main.c index f293626fb..44f572a8e 100644 --- a/channels/rdpsnd/client/rdpsnd_main.c +++ b/channels/rdpsnd/client/rdpsnd_main.c @@ -1045,7 +1045,6 @@ static VOID VCAPITYPE rdpsnd_virtual_channel_open_event_ex(LPVOID lpUserParam, D break; case CHANNEL_EVENT_WRITE_COMPLETE: - Stream_Free((wStream*) pData, TRUE); break; case CHANNEL_EVENT_USER: diff --git a/channels/remdesk/client/remdesk_main.c b/channels/remdesk/client/remdesk_main.c index 595de719d..febe6a2a6 100644 --- a/channels/remdesk/client/remdesk_main.c +++ b/channels/remdesk/client/remdesk_main.c @@ -788,7 +788,6 @@ static VOID VCAPITYPE remdesk_virtual_channel_open_event_ex(LPVOID lpUserParam, break; case CHANNEL_EVENT_WRITE_COMPLETE: - Stream_Free((wStream*) pData, TRUE); break; case CHANNEL_EVENT_USER: diff --git a/client/X11/xf_channels.h b/client/X11/xf_channels.h index ac91f84a1..8a8c3b19b 100644 --- a/client/X11/xf_channels.h +++ b/client/X11/xf_channels.h @@ -32,9 +32,6 @@ #include #include -int xf_on_channel_connected(freerdp* instance, const char* name, void* pInterface); -int xf_on_channel_disconnected(freerdp* instance, const char* name, void* pInterface); - void xf_OnChannelConnectedEventHandler(void* context, ChannelConnectedEventArgs* e); void xf_OnChannelDisconnectedEventHandler(void* context, ChannelDisconnectedEventArgs* e); diff --git a/include/freerdp/freerdp.h b/include/freerdp/freerdp.h index 928dc1d05..80726337a 100644 --- a/include/freerdp/freerdp.h +++ b/include/freerdp/freerdp.h @@ -240,7 +240,9 @@ struct rdp_freerdp Callback for context deallocation Can be set before calling freerdp_context_free() to have it executed before deallocation. Must be set to NULL if not needed. */ - UINT64 paddingC[48 - 35]; /* 35 */ + UINT64 paddingC[47 - 35]; /* 35 */ + + ALIGN64 UINT ConnectionCallbackState; /* 47 */ ALIGN64 pPreConnect PreConnect; /**< (offset 48) Callback for pre-connect operations. diff --git a/libfreerdp/core/client.c b/libfreerdp/core/client.c index c710ff061..cce7aa535 100644 --- a/libfreerdp/core/client.c +++ b/libfreerdp/core/client.c @@ -347,11 +347,11 @@ UINT freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) UINT error = CHANNEL_RC_OK; UINT index; char* hostname; - int hostnameLength; + size_t hostnameLength; CHANNEL_CLIENT_DATA* pChannelClientData; channels->connected = TRUE; hostname = instance->settings->ServerHostname; - hostnameLength = (int) strlen(hostname); + hostnameLength = strlen(hostname); for (index = 0; index < channels->clientDataCount; index++) { diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 81df25194..05a902f0f 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -357,7 +357,6 @@ BOOL rdp_client_redirect(rdpRdp* rdp) rdpSettings* settings; rdpContext* context; rdpChannels* channels; - BOOL connected; if (!rdp || !rdp->context || !rdp->context->channels) return FALSE; @@ -365,7 +364,6 @@ BOOL rdp_client_redirect(rdpRdp* rdp) settings = rdp->settings; context = rdp->context; channels = context->channels; - connected = channels->connected; if (!rdp_client_disconnect_and_clear(rdp)) return FALSE; @@ -426,7 +424,7 @@ BOOL rdp_client_redirect(rdpRdp* rdp) status = rdp_client_connect(rdp); - if (status && connected) + if (status && (context->instance->ConnectionCallbackState == CLIENT_STATE_POSTCONNECT_PASSED)) status = (freerdp_channels_post_connect(context->channels, context->instance) == CHANNEL_RC_OK); return status; @@ -437,21 +435,19 @@ BOOL rdp_client_reconnect(rdpRdp* rdp) BOOL status; rdpContext* context; rdpChannels* channels; - BOOL connected; if (!rdp || !rdp->context || !rdp->context->channels) return FALSE; context = rdp->context; channels = context->channels; - connected = channels->connected; if (!rdp_client_disconnect_and_clear(rdp)) return FALSE; status = rdp_client_connect(rdp); - if (status && connected) + if (status && (context->instance->ConnectionCallbackState == CLIENT_STATE_POSTCONNECT_PASSED)) status = (freerdp_channels_post_connect(channels, context->instance) == CHANNEL_RC_OK); return status; diff --git a/libfreerdp/core/connection.h b/libfreerdp/core/connection.h index 62aaea051..78dbba574 100644 --- a/libfreerdp/core/connection.h +++ b/libfreerdp/core/connection.h @@ -49,6 +49,14 @@ enum CONNECTION_STATE CONNECTION_STATE_ACTIVE }; +enum CLIENT_CONNECTION_STATE +{ + CLIENT_STATE_INITIAL, + CLIENT_STATE_PRECONNECT_PASSED, + CLIENT_STATE_POSTCONNECT_PASSED, + CLIENT_STATE_POSTDISCONNECT_PASSED +}; + FREERDP_LOCAL BOOL rdp_client_connect(rdpRdp* rdp); FREERDP_LOCAL BOOL rdp_client_disconnect(rdpRdp* rdp); FREERDP_LOCAL BOOL rdp_client_disconnect_and_clear(rdpRdp* rdp); diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index 676a6b8dc..d6fb99bc8 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -157,6 +157,7 @@ BOOL freerdp_connect(freerdp* instance) return FALSE; /* We always set the return code to 0 before we start the connect sequence*/ + instance->ConnectionCallbackState = CLIENT_STATE_INITIAL; connectErrorCode = 0; instance->context->LastError = FREERDP_ERROR_SUCCESS; clearChannelError(instance->context); @@ -165,6 +166,7 @@ BOOL freerdp_connect(freerdp* instance) settings = instance->settings; instance->context->codecs = codecs_new(instance->context); IFCALLRET(instance->PreConnect, status, instance); + instance->ConnectionCallbackState = CLIENT_STATE_PRECONNECT_PASSED; if (status) status2 = freerdp_channels_pre_connect(instance->context->channels, @@ -212,6 +214,7 @@ BOOL freerdp_connect(freerdp* instance) } IFCALLRET(instance->PostConnect, status, instance); + instance->ConnectionCallbackState = CLIENT_STATE_POSTCONNECT_PASSED; if (status) status2 = freerdp_channels_post_connect(instance->context->channels, instance); @@ -501,6 +504,7 @@ BOOL freerdp_disconnect(freerdp* instance) } IFCALL(instance->PostDisconnect, instance); + instance->ConnectionCallbackState = CLIENT_STATE_POSTDISCONNECT_PASSED; if (instance->update->pcap_rfx) {