mirror of https://github.com/FreeRDP/FreeRDP
Properly handle demand active state
The demand active state might be called when receiving data from the client during initial connection phase or might be triggered server side after sending a deactivate all pdu
This commit is contained in:
parent
8210ee77db
commit
367ecf3c0b
|
@ -24,6 +24,7 @@
|
|||
#include "info.h"
|
||||
#include "input.h"
|
||||
#include "rdp.h"
|
||||
#include "peer.h"
|
||||
|
||||
#include "connection.h"
|
||||
#include "transport.h"
|
||||
|
@ -1550,8 +1551,9 @@ BOOL rdp_server_reactivate(rdpRdp* rdp)
|
|||
return FALSE;
|
||||
|
||||
rdp_finalize_set_flag(rdp, FINALIZE_DEACTIVATE_REACTIVATE);
|
||||
return rdp_server_transition_to_state(rdp,
|
||||
CONNECTION_STATE_CAPABILITIES_EXCHANGE_DEMAND_ACTIVE);
|
||||
if (!rdp_server_transition_to_state(rdp, CONNECTION_STATE_CAPABILITIES_EXCHANGE_DEMAND_ACTIVE))
|
||||
return FALSE;
|
||||
return rdp_peer_handle_state_demand_active(client) > 0;
|
||||
}
|
||||
|
||||
BOOL rdp_server_transition_to_state(rdpRdp* rdp, CONNECTION_STATE state)
|
||||
|
|
|
@ -697,6 +697,33 @@ static int peer_unexpected_client_message(rdpRdp* rdp, UINT32 flag)
|
|||
return 0; /* we ignore this as per spec input PDU are already allowed */
|
||||
}
|
||||
|
||||
int rdp_peer_handle_state_demand_active(freerdp_peer* client)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
WINPR_ASSERT(client);
|
||||
WINPR_ASSERT(client->context);
|
||||
|
||||
rdpRdp* rdp = client->context->rdp;
|
||||
WINPR_ASSERT(rdp);
|
||||
|
||||
if (client->Capabilities && !client->Capabilities(client))
|
||||
{
|
||||
WLog_ERR(TAG, "[%s] freerdp_peer::Capabilities() callback failed",
|
||||
rdp_get_state_string(rdp));
|
||||
}
|
||||
else if (!rdp_send_demand_active(rdp))
|
||||
{
|
||||
WLog_ERR(TAG, "[%s] rdp_send_demand_active() fail", rdp_get_state_string(rdp));
|
||||
}
|
||||
else
|
||||
{
|
||||
rdp_server_transition_to_state(rdp, CONNECTION_STATE_CAPABILITIES_EXCHANGE_MONITOR_LAYOUT);
|
||||
ret = 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int peer_recv_callback_internal(rdpTransport* transport, wStream* s, void* extra)
|
||||
{
|
||||
UINT32 SelectedProtocol;
|
||||
|
@ -891,21 +918,7 @@ static int peer_recv_callback_internal(rdpTransport* transport, wStream* s, void
|
|||
break;
|
||||
|
||||
case CONNECTION_STATE_CAPABILITIES_EXCHANGE_DEMAND_ACTIVE:
|
||||
if (client->Capabilities && !client->Capabilities(client))
|
||||
{
|
||||
WLog_ERR(TAG, "[%s] freerdp_peer::Capabilities() callback failed",
|
||||
rdp_get_state_string(rdp));
|
||||
}
|
||||
else if (!rdp_send_demand_active(rdp))
|
||||
{
|
||||
WLog_ERR(TAG, "[%s] rdp_send_demand_active() fail", rdp_get_state_string(rdp));
|
||||
}
|
||||
else
|
||||
{
|
||||
rdp_server_transition_to_state(
|
||||
rdp, CONNECTION_STATE_CAPABILITIES_EXCHANGE_MONITOR_LAYOUT);
|
||||
ret = 1;
|
||||
}
|
||||
ret = rdp_peer_handle_state_demand_active(client);
|
||||
break;
|
||||
|
||||
case CONNECTION_STATE_CAPABILITIES_EXCHANGE_MONITOR_LAYOUT:
|
||||
|
|
|
@ -26,4 +26,6 @@
|
|||
|
||||
#include <freerdp/peer.h>
|
||||
|
||||
FREERDP_LOCAL int rdp_peer_handle_state_demand_active(freerdp_peer* client);
|
||||
|
||||
#endif /* FREERDP_LIB_CORE_PEER_H */
|
||||
|
|
Loading…
Reference in New Issue