From b56e17e611439ef36d6c0732e96cced5ce8e9e9b Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 7 Jan 2026 16:48:06 +0100 Subject: [PATCH 1/2] [core,freerdp] fix race in freerdp_abort_connect_context When aborting a connection only notify the client thread. Let freerdp_disconnect handle sending server notifications. --- libfreerdp/core/freerdp.c | 45 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index fe2d9ac52..0f6d0dfb6 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -318,17 +318,6 @@ BOOL freerdp_abort_connect_context(rdpContext* context) return FALSE; freerdp_set_last_error_if_not(context, FREERDP_ERROR_CONNECT_CANCELLED); - - /* Try to send a [MS-RDPBCGR] 1.3.1.4.1 User-Initiated on Client PDU, we don't care about - * success */ - if (context->rdp && context->rdp->mcs) - { - if (!context->ServerMode) - { - (void)mcs_send_disconnect_provider_ultimatum(context->rdp->mcs, - Disconnect_Ultimatum_user_requested); - } - } return utils_abort_connect(context->rdp); } @@ -608,29 +597,45 @@ static BOOL freerdp_send_channel_packet(freerdp* instance, UINT16 channelId, siz BOOL freerdp_disconnect(freerdp* instance) { BOOL rc = TRUE; - rdpRdp* rdp = NULL; - rdp_update_internal* up = NULL; if (!instance || !instance->context) return FALSE; - rdp = instance->context->rdp; + rdpRdp* rdp = instance->context->rdp; + if (rdp) + { + /* Try to send a [MS-RDPBCGR] 1.3.1.4.1 User-Initiated on Client PDU, we don't care about + * success */ + if (freerdp_get_last_error(instance->context) == FREERDP_ERROR_CONNECT_CANCELLED) + { + (void)mcs_send_disconnect_provider_ultimatum(rdp->mcs, + Disconnect_Ultimatum_user_requested); + } + } + utils_abort_connect(rdp); if (!rdp_client_disconnect(rdp)) rc = FALSE; - up = update_cast(rdp->update); + rdp_update_internal* up = NULL; + if (rdp && rdp->update) + { + up = update_cast(rdp->update); - update_post_disconnect(rdp->update); + update_post_disconnect(rdp->update); + } IFCALL(instance->PostDisconnect, instance); - if (up->pcap_rfx) + if (up) { - up->dump_rfx = FALSE; - pcap_close(up->pcap_rfx); - up->pcap_rfx = NULL; + if (up->pcap_rfx) + { + up->dump_rfx = FALSE; + pcap_close(up->pcap_rfx); + up->pcap_rfx = NULL; + } } freerdp_channels_close(instance->context->channels, instance); From 4f529202748b79fbd1a3eda43724c7175825defd Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 7 Jan 2026 17:01:28 +0100 Subject: [PATCH 2/2] [client,x11] abort session when window is closed --- client/X11/xf_client.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 854404e0e..d65a27d2e 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -1554,6 +1554,7 @@ static BOOL handle_window_events(freerdp* instance) if (!xf_process_x_events(instance)) { WLog_DBG(TAG, "Closed from X11"); + freerdp_abort_connect_context(instance->context); return FALSE; }