Repository: guacamole-server Updated Branches: refs/heads/master 0f78b01e8 -> 8c844e6ea
GUACAMOLE-484: Ensure disconnect reason code is checked for orderly RDP disconnect. Project: http://git-wip-us.apache.org/repos/asf/guacamole-server/repo Commit: http://git-wip-us.apache.org/repos/asf/guacamole-server/commit/d562cb76 Tree: http://git-wip-us.apache.org/repos/asf/guacamole-server/tree/d562cb76 Diff: http://git-wip-us.apache.org/repos/asf/guacamole-server/diff/d562cb76 Branch: refs/heads/master Commit: d562cb7648ab228cdd5d8ab528ee8804faba2d20 Parents: 0f78b01 Author: Michael Jumper <mjum...@apache.org> Authored: Mon Jan 22 12:16:09 2018 -0800 Committer: Michael Jumper <mjum...@apache.org> Committed: Mon Jan 22 12:16:09 2018 -0800 ---------------------------------------------------------------------- src/protocols/rdp/rdp.c | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/d562cb76/src/protocols/rdp/rdp.c ---------------------------------------------------------------------- diff --git a/src/protocols/rdp/rdp.c b/src/protocols/rdp/rdp.c index 0b15d05..c8f7a85 100644 --- a/src/protocols/rdp/rdp.c +++ b/src/protocols/rdp/rdp.c @@ -763,21 +763,14 @@ static int guac_rdp_handle_connection(guac_client* client) { pthread_mutex_lock(&(rdp_client->rdp_lock)); /* Check the libfreerdp fds */ - if (!freerdp_check_fds(rdp_inst)) { - guac_client_abort(client, - GUAC_PROTOCOL_STATUS_UPSTREAM_UNAVAILABLE, - "Error handling RDP file descriptors"); - pthread_mutex_unlock(&(rdp_client->rdp_lock)); - return 1; - } + if (!freerdp_check_fds(rdp_inst) + || !freerdp_channels_check_fds(channels, rdp_inst)) { - /* Check channel fds */ - if (!freerdp_channels_check_fds(channels, rdp_inst)) { - guac_client_abort(client, - GUAC_PROTOCOL_STATUS_UPSTREAM_UNAVAILABLE, - "Error handling RDP channel file descriptors"); + /* Flag connection failure */ + wait_result = -1; pthread_mutex_unlock(&(rdp_client->rdp_lock)); - return 1; + break; + } /* Check for channel events */ @@ -801,13 +794,6 @@ static int guac_rdp_handle_connection(guac_client* client) { } - /* Handle RDP disconnect */ - if (freerdp_shall_disconnect(rdp_inst)) { - guac_rdp_client_abort(client); - pthread_mutex_unlock(&(rdp_client->rdp_lock)); - return 1; - } - pthread_mutex_unlock(&(rdp_client->rdp_lock)); /* Calculate time remaining in frame */ @@ -841,6 +827,17 @@ static int guac_rdp_handle_connection(guac_client* client) { } + /* Test whether the RDP server is closing the connection */ + pthread_mutex_lock(&(rdp_client->rdp_lock)); + int connection_closing = freerdp_shall_disconnect(rdp_inst); + pthread_mutex_unlock(&(rdp_client->rdp_lock)); + + /* Close connection cleanly if server is disconnecting */ + if (connection_closing) { + guac_rdp_client_abort(client); + return 1; + } + /* If an error occurred, fail */ if (wait_result < 0) guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_UNAVAILABLE,