[core,mcs] replace rdpTransport pointer with rdpContext

Only keep pointers to rdpContext so updates/changes to rdpTransport are
not leading to dangling pointers
This commit is contained in:
Armin Novak
2026-01-07 10:28:49 +01:00
parent d51fecc52d
commit 3e6dda95c2
6 changed files with 54 additions and 73 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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;