mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
[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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user