From 3e6dda95c25a24294941116bf8eb2fef53250d9e Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 7 Jan 2026 10:28:49 +0100 Subject: [PATCH] [core,mcs] replace rdpTransport pointer with rdpContext Only keep pointers to rdpContext so updates/changes to rdpTransport are not leading to dangling pointers --- libfreerdp/core/connection.c | 4 +- libfreerdp/core/freerdp.c | 16 ++----- libfreerdp/core/gcc.c | 12 ++--- libfreerdp/core/mcs.c | 89 ++++++++++++++++-------------------- libfreerdp/core/mcs.h | 4 +- libfreerdp/core/rdp.c | 2 +- 6 files changed, 54 insertions(+), 73 deletions(-) diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index b3d213277..8f4970ad7 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -789,7 +789,9 @@ static BOOL rdp_client_establish_keys(rdpRdp* rdp) Stream_Write(s, crypt_client_random, info->ModulusLength); Stream_Zero(s, 8); Stream_SealLength(s); - status = transport_write(rdp->mcs->transport, s); + + rdpTransport* transport = freerdp_get_transport(rdp->context); + status = transport_write(transport, s); if (status < 0) goto end; diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index 0f6d0dfb6..bb4390042 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -1473,22 +1473,18 @@ static void test_mcs_free(rdpMcs* mcs) if (!mcs) return; - rdpTransport* transport = mcs->transport; - rdpContext* context = transport_get_context(transport); - if (context) + if (mcs->context) { - rdpSettings* settings = context->settings; + rdpSettings* settings = mcs->context->settings; freerdp_settings_free(settings); } - free(context); - transport_free(transport); + free(mcs->context); mcs_free(mcs); } static rdpMcs* test_mcs_new(void) { - rdpTransport* transport = NULL; rdpSettings* settings = freerdp_settings_new(0); rdpContext* context = calloc(1, sizeof(rdpContext)); @@ -1500,13 +1496,9 @@ static rdpMcs* test_mcs_new(void) if (!context) goto fail; context->settings = settings; - transport = transport_new(context); - if (!transport) - goto fail; - return mcs_new(transport); + return mcs_new(context); fail: - transport_free(transport); free(context); freerdp_settings_free(settings); diff --git a/libfreerdp/core/gcc.c b/libfreerdp/core/gcc.c index 1d7ceb034..20a483d4f 100644 --- a/libfreerdp/core/gcc.c +++ b/libfreerdp/core/gcc.c @@ -121,21 +121,17 @@ static BOOL gcc_write_server_multitransport_channel_data(wStream* s, const rdpMc static rdpSettings* mcs_get_settings(rdpMcs* mcs) { WINPR_ASSERT(mcs); + WINPR_ASSERT(mcs->context); - rdpContext* context = transport_get_context(mcs->transport); - WINPR_ASSERT(context); - - return context->settings; + return mcs->context->settings; } static const rdpSettings* mcs_get_const_settings(const rdpMcs* mcs) { WINPR_ASSERT(mcs); + WINPR_ASSERT(mcs->context); - const rdpContext* context = transport_get_context(mcs->transport); - WINPR_ASSERT(context); - - return context->settings; + return mcs->context->settings; } static char* rdp_early_server_caps_string(UINT32 flags, char* buffer, size_t size) diff --git a/libfreerdp/core/mcs.c b/libfreerdp/core/mcs.c index fbae85e8d..dc0a990ea 100644 --- a/libfreerdp/core/mcs.c +++ b/libfreerdp/core/mcs.c @@ -824,17 +824,12 @@ static BOOL mcs_send_connect_initial(rdpMcs* mcs) size_t bm = 0; size_t em = 0; wStream* gcc_CCrq = NULL; - wStream* client_data = NULL; - rdpContext* context = NULL; - if (!mcs) + if (!mcs || !mcs->context) return FALSE; - context = transport_get_context(mcs->transport); - WINPR_ASSERT(context); - - mcs_initialize_client_channels(mcs, context->settings); - client_data = Stream_New(NULL, 512); + mcs_initialize_client_channels(mcs, mcs->context->settings); + wStream* client_data = Stream_New(NULL, 512); if (!client_data) { @@ -883,7 +878,9 @@ static BOOL mcs_send_connect_initial(rdpMcs* mcs) goto out; Stream_SetPosition(s, em); Stream_SealLength(s); - status = transport_write(mcs->transport, s); + + rdpTransport* transport = freerdp_get_transport(mcs->context); + status = transport_write(transport, s); out: Stream_Free(s, TRUE); Stream_Free(gcc_CCrq, TRUE); @@ -946,12 +943,11 @@ BOOL mcs_send_connect_response(rdpMcs* mcs) size_t bm = 0; size_t em = 0; wStream* gcc_CCrsp = NULL; - wStream* server_data = NULL; if (!mcs) return FALSE; - server_data = Stream_New(NULL, 512); + wStream* server_data = Stream_New(NULL, 512); if (!server_data) { @@ -998,7 +994,9 @@ BOOL mcs_send_connect_response(rdpMcs* mcs) goto out; Stream_SetPosition(s, em); Stream_SealLength(s); - status = transport_write(mcs->transport, s); + + rdpTransport* transport = freerdp_get_transport(mcs->context); + status = transport_write(transport, s); out: Stream_Free(s, TRUE); Stream_Free(gcc_CCrsp, TRUE); @@ -1042,14 +1040,12 @@ BOOL mcs_recv_erect_domain_request(rdpMcs* mcs, wStream* s) BOOL mcs_send_erect_domain_request(rdpMcs* mcs) { - wStream* s = NULL; - int status = 0; UINT16 length = 12; if (!mcs) return FALSE; - s = Stream_New(NULL, length); + wStream* s = Stream_New(NULL, length); if (!s) { @@ -1061,7 +1057,9 @@ BOOL mcs_send_erect_domain_request(rdpMcs* mcs) per_write_integer(s, 0); /* subHeight (INTEGER) */ per_write_integer(s, 0); /* subInterval (INTEGER) */ Stream_SealLength(s); - status = transport_write(mcs->transport, s); + + rdpTransport* transport = freerdp_get_transport(mcs->context); + const int status = transport_write(transport, s); Stream_Free(s, TRUE); return (status < 0) ? FALSE : TRUE; } @@ -1093,14 +1091,12 @@ BOOL mcs_recv_attach_user_request(rdpMcs* mcs, wStream* s) BOOL mcs_send_attach_user_request(rdpMcs* mcs) { - wStream* s = NULL; - int status = 0; UINT16 length = 8; if (!mcs) return FALSE; - s = Stream_New(NULL, length); + wStream* s = Stream_New(NULL, length); if (!s) { @@ -1110,7 +1106,9 @@ BOOL mcs_send_attach_user_request(rdpMcs* mcs) mcs_write_domain_mcspdu_header(s, DomainMCSPDU_AttachUserRequest, length, 0); Stream_SealLength(s); - status = transport_write(mcs->transport, s); + + rdpTransport* transport = freerdp_get_transport(mcs->context); + const int status = transport_write(transport, s); Stream_Free(s, TRUE); return (status < 0) ? FALSE : TRUE; } @@ -1146,14 +1144,12 @@ BOOL mcs_recv_attach_user_confirm(rdpMcs* mcs, wStream* s) BOOL mcs_send_attach_user_confirm(rdpMcs* mcs) { - wStream* s = NULL; - int status = 0; UINT16 length = 11; if (!mcs) return FALSE; - s = Stream_New(NULL, length); + wStream* s = Stream_New(NULL, length); if (!s) { @@ -1166,7 +1162,9 @@ BOOL mcs_send_attach_user_confirm(rdpMcs* mcs) per_write_enumerated(s, 0, MCS_Result_enum_length); /* result */ per_write_integer16(s, mcs->userId, MCS_BASE_CHANNEL_ID); /* initiator (UserId) */ Stream_SealLength(s); - status = transport_write(mcs->transport, s); + + rdpTransport* transport = freerdp_get_transport(mcs->context); + const int status = transport_write(transport, s); Stream_Free(s, TRUE); return (status < 0) ? FALSE : TRUE; } @@ -1217,13 +1215,11 @@ BOOL mcs_recv_channel_join_request(rdpMcs* mcs, const rdpSettings* settings, wSt BOOL mcs_send_channel_join_request(rdpMcs* mcs, UINT16 channelId) { - wStream* s = NULL; - int status = 0; UINT16 length = 12; WINPR_ASSERT(mcs); - s = Stream_New(NULL, length); + wStream* s = Stream_New(NULL, length); if (!s) { @@ -1235,7 +1231,9 @@ BOOL mcs_send_channel_join_request(rdpMcs* mcs, UINT16 channelId) per_write_integer16(s, mcs->userId, MCS_BASE_CHANNEL_ID); per_write_integer16(s, channelId, 0); Stream_SealLength(s); - status = transport_write(mcs->transport, s); + + rdpTransport* transport = freerdp_get_transport(mcs->context); + const int status = transport_write(transport, s); Stream_Free(s, TRUE); return (status < 0) ? FALSE : TRUE; } @@ -1278,14 +1276,13 @@ BOOL mcs_recv_channel_join_confirm(rdpMcs* mcs, wStream* s, UINT16* channelId) BOOL mcs_send_channel_join_confirm(rdpMcs* mcs, UINT16 channelId) { - wStream* s = NULL; int status = -1; UINT16 length = 15; if (!mcs) return FALSE; - s = Stream_New(NULL, length); + wStream* s = Stream_New(NULL, length); if (!s) { @@ -1304,7 +1301,9 @@ BOOL mcs_send_channel_join_confirm(rdpMcs* mcs, UINT16 channelId) if (!per_write_integer16(s, channelId, 0)) /* channelId */ goto fail; Stream_SealLength(s); - status = transport_write(mcs->transport, s); + + rdpTransport* transport = freerdp_get_transport(mcs->context); + status = transport_write(transport, s); fail: Stream_Free(s, TRUE); return (status < 0) ? FALSE : TRUE; @@ -1368,13 +1367,12 @@ BOOL mcs_recv_disconnect_provider_ultimatum(WINPR_ATTR_UNUSED rdpMcs* mcs, wStre BOOL mcs_send_disconnect_provider_ultimatum(rdpMcs* mcs, enum Disconnect_Ultimatum reason) { - wStream* s = NULL; int status = -1; UINT16 length = 9; WINPR_ASSERT(mcs); - s = Stream_New(NULL, length); + wStream* s = Stream_New(NULL, length); if (!s) goto fail; @@ -1384,7 +1382,9 @@ BOOL mcs_send_disconnect_provider_ultimatum(rdpMcs* mcs, enum Disconnect_Ultimat if (!per_write_enumerated(s, 0x80, WINPR_ASSERTING_INT_CAST(BYTE, reason))) goto fail; - status = transport_write(mcs->transport, s); + + rdpTransport* transport = freerdp_get_transport(mcs->context); + status = transport_write(transport, s); fail: WLog_Print(mcs->log, WLOG_DEBUG, "sending DisconnectProviderUltimatum(%s)", freerdp_disconnect_reason_string((int)reason)); @@ -1394,20 +1394,13 @@ fail: BOOL mcs_client_begin(rdpMcs* mcs) { - rdpContext* context = NULL; - - if (!mcs || !mcs->transport) - return FALSE; - - context = transport_get_context(mcs->transport); - - if (!context) + if (!mcs || !mcs->context) return FALSE; /* First transition state, we need this to trigger session recording */ if (!mcs_send_connect_initial(mcs)) { - freerdp_set_last_error_if_not(context, FREERDP_ERROR_MCS_CONNECT_INITIAL_ERROR); + freerdp_set_last_error_if_not(mcs->context, FREERDP_ERROR_MCS_CONNECT_INITIAL_ERROR); WLog_Print(mcs->log, WLOG_ERROR, "Error: unable to send MCS Connect Initial"); return FALSE; @@ -1418,22 +1411,20 @@ BOOL mcs_client_begin(rdpMcs* mcs) /** * Instantiate new MCS module. - * @param transport transport + * @param context rdpContext to use * @return new MCS module */ -rdpMcs* mcs_new(rdpTransport* transport) +rdpMcs* mcs_new(rdpContext* context) { - rdpMcs* mcs = NULL; - - mcs = (rdpMcs*)calloc(1, sizeof(rdpMcs)); + rdpMcs* mcs = (rdpMcs*)calloc(1, sizeof(rdpMcs)); if (!mcs) return NULL; mcs->log = WLog_Get(MCS_TAG); WINPR_ASSERT(mcs->log); - mcs->transport = transport; + mcs->context = context; mcs_init_domain_parameters(&mcs->targetParameters, 34, 2, 0, 0xFFFF); mcs_init_domain_parameters(&mcs->minimumParameters, 1, 1, 1, 0x420); mcs_init_domain_parameters(&mcs->maximumParameters, 0xFFFF, 0xFC17, 0xFFFF, 0xFFFF); diff --git a/libfreerdp/core/mcs.h b/libfreerdp/core/mcs.h index 58328205a..a52e2e52c 100644 --- a/libfreerdp/core/mcs.h +++ b/libfreerdp/core/mcs.h @@ -127,7 +127,7 @@ typedef struct rdp_mcs_channel rdpMcsChannel; struct rdp_mcs { - rdpTransport* transport; + rdpContext* context; UINT16 userId; UINT16 baseChannelId; @@ -185,6 +185,6 @@ FREERDP_LOCAL BOOL mcs_client_begin(rdpMcs* mcs); FREERDP_LOCAL void mcs_free(rdpMcs* mcs); WINPR_ATTR_MALLOC(mcs_free, 1) -FREERDP_LOCAL rdpMcs* mcs_new(rdpTransport* transport); +FREERDP_LOCAL rdpMcs* mcs_new(rdpContext* context); #endif /* FREERDP_LIB_CORE_MCS_H */ diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index d1a9bf6c7..f73163052 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -2326,7 +2326,7 @@ static bool rdp_new_common(rdpRdp* rdp) if (!rdp->nego) goto fail; - rdp->mcs = mcs_new(rdp->transport); + rdp->mcs = mcs_new(rdp->context); if (!rdp->mcs) goto fail;