Merge pull request #11288 from akallabeth/tsg-fix

[core,gateway] add tsg checks
This commit is contained in:
akallabeth
2025-03-05 14:17:45 +01:00
committed by GitHub
2 changed files with 53 additions and 36 deletions

View File

@@ -3987,6 +3987,8 @@ static BOOL parse_gateway_cred_option(rdpSettings* settings, const char* value,
static BOOL parse_gateway_type_option(rdpSettings* settings, const char* value) static BOOL parse_gateway_type_option(rdpSettings* settings, const char* value)
{ {
BOOL rc = FALSE;
WINPR_ASSERT(settings); WINPR_ASSERT(settings);
WINPR_ASSERT(value); WINPR_ASSERT(value);
@@ -3997,6 +3999,7 @@ static BOOL parse_gateway_type_option(rdpSettings* settings, const char* value)
!freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpUseWebsockets, FALSE) || !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpUseWebsockets, FALSE) ||
!freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, FALSE)) !freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, FALSE))
return FALSE; return FALSE;
rc = TRUE;
} }
else else
{ {
@@ -4006,6 +4009,7 @@ static BOOL parse_gateway_type_option(rdpSettings* settings, const char* value)
!freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpTransport, TRUE) || !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpTransport, TRUE) ||
!freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, FALSE)) !freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, FALSE))
return FALSE; return FALSE;
rc = TRUE;
} }
else if (option_equals(value, "auto")) else if (option_equals(value, "auto"))
{ {
@@ -4013,6 +4017,7 @@ static BOOL parse_gateway_type_option(rdpSettings* settings, const char* value)
!freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpTransport, TRUE) || !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpTransport, TRUE) ||
!freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, FALSE)) !freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, FALSE))
return FALSE; return FALSE;
rc = TRUE;
} }
else if (option_equals(value, "arm")) else if (option_equals(value, "arm"))
{ {
@@ -4021,9 +4026,10 @@ static BOOL parse_gateway_type_option(rdpSettings* settings, const char* value)
!freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpUseWebsockets, FALSE) || !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpUseWebsockets, FALSE) ||
!freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, TRUE)) !freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, TRUE))
return FALSE; return FALSE;
rc = TRUE;
} }
} }
return TRUE; return rc;
} }
static BOOL parse_gateway_usage_option(rdpSettings* settings, const char* value) static BOOL parse_gateway_usage_option(rdpSettings* settings, const char* value)

View File

@@ -1504,7 +1504,6 @@ static BOOL tsg_ndr_read_consent_message(wLog* log, rdpContext* context, wStream
static BOOL tsg_ndr_read_tunnel_context(wLog* log, wStream* s, CONTEXT_HANDLE* tunnelContext, static BOOL tsg_ndr_read_tunnel_context(wLog* log, wStream* s, CONTEXT_HANDLE* tunnelContext,
UINT32* tunnelId) UINT32* tunnelId)
{ {
if (!tsg_stream_align(log, s, 4)) if (!tsg_stream_align(log, s, 4))
return FALSE; return FALSE;
@@ -1553,43 +1552,55 @@ static BOOL tsg_ndr_read_caps_response(wLog* log, rdpContext* context, wStream*
Stream_Read_UINT32(s, MsgId); /* MsgId (4 bytes) */ Stream_Read_UINT32(s, MsgId); /* MsgId (4 bytes) */
Stream_Read_UINT32(s, MsgType); /* MsgType (4 bytes) */ Stream_Read_UINT32(s, MsgType); /* MsgType (4 bytes) */
Stream_Read_UINT32(s, IsMessagePresent); /* IsMessagePresent (4 bytes) */ Stream_Read_UINT32(s, IsMessagePresent); /* IsMessagePresent (4 bytes) */
Stream_Read_UINT32(s, MessageSwitchValue); /* MessageSwitchValue (4 bytes) */ if (IsMessagePresent != 0)
}
{
UINT32 MsgPtr = 0;
if (!tsg_ndr_pointer_read(log, s, index, &MsgPtr, TRUE))
return FALSE;
}
if (!tsg_ndr_read_quarenc_data(log, s, index, &caps->pktQuarEncResponse))
goto fail;
switch (MessageSwitchValue)
{
case TSG_ASYNC_MESSAGE_CONSENT_MESSAGE:
case TSG_ASYNC_MESSAGE_SERVICE_MESSAGE:
{ {
if (!tsg_ndr_read_consent_message(log, context, s, index))
Stream_Read_UINT32(s, MessageSwitchValue); /* MessageSwitchValue (4 bytes) */
(void)MsgId; /* [MS-TSGU] 2.2.9.2.1.9 TSG_PACKET_MSG_RESPONSE MsgId is unused */
if (MsgType != MessageSwitchValue)
{
WLog_ERR(TAG,
"[MS-TSGU] 2.2.9.2.1.9 TSG_PACKET_MSG_RESPONSE MsgType[0x%08" PRIx32
"] != MessageSwitchValue [0x%08" PRIx32 "]",
MsgType, MessageSwitchValue);
goto fail; goto fail;
}
{
UINT32 MsgPtr = 0;
if (!tsg_ndr_pointer_read(log, s, index, &MsgPtr, TRUE))
return FALSE;
}
if (!tsg_ndr_read_quarenc_data(log, s, index, &caps->pktQuarEncResponse))
goto fail;
switch (MessageSwitchValue)
{
case TSG_ASYNC_MESSAGE_CONSENT_MESSAGE:
case TSG_ASYNC_MESSAGE_SERVICE_MESSAGE:
if (!tsg_ndr_read_consent_message(log, context, s, index))
goto fail;
break;
case TSG_ASYNC_MESSAGE_REAUTH:
{
if (!tsg_stream_align(log, s, 8))
goto fail;
if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
goto fail;
Stream_Seek_UINT64(s); /* TunnelContext (8 bytes) */
}
break;
default:
WLog_Print(log, WLOG_ERROR, "Unexpected Message Type: 0x%" PRIX32 "",
MessageSwitchValue);
goto fail;
}
} }
break;
case TSG_ASYNC_MESSAGE_REAUTH:
{
if (!tsg_stream_align(log, s, 8))
goto fail;
if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
goto fail;
Stream_Seek_UINT64(s); /* TunnelContext (8 bytes) */
}
break;
default:
WLog_Print(log, WLOG_ERROR, "Unexpected Message Type: 0x%" PRIX32 "",
MessageSwitchValue);
goto fail;
} }
return tsg_ndr_read_tunnel_context(log, s, tunnelContext, tunnelId); return tsg_ndr_read_tunnel_context(log, s, tunnelContext, tunnelId);