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,

Reply via email to