GUACAMOLE-34: Ensure guac_client_stop() or guac_client_abort() are called in ALL cases where the client thread terminates.
This commit is contained in:
parent
7e3c28a1c2
commit
a64c3e0179
@ -800,7 +800,8 @@ static int guac_rdp_handle_connection(guac_client* client) {
|
|||||||
|
|
||||||
/* Check the libfreerdp fds */
|
/* Check the libfreerdp fds */
|
||||||
if (!freerdp_check_fds(rdp_inst)) {
|
if (!freerdp_check_fds(rdp_inst)) {
|
||||||
guac_client_log(client, GUAC_LOG_DEBUG,
|
guac_client_abort(client,
|
||||||
|
GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||||
"Error handling RDP file descriptors");
|
"Error handling RDP file descriptors");
|
||||||
pthread_mutex_unlock(&(rdp_client->rdp_lock));
|
pthread_mutex_unlock(&(rdp_client->rdp_lock));
|
||||||
return 1;
|
return 1;
|
||||||
@ -808,7 +809,8 @@ static int guac_rdp_handle_connection(guac_client* client) {
|
|||||||
|
|
||||||
/* Check channel fds */
|
/* Check channel fds */
|
||||||
if (!freerdp_channels_check_fds(channels, rdp_inst)) {
|
if (!freerdp_channels_check_fds(channels, rdp_inst)) {
|
||||||
guac_client_log(client, GUAC_LOG_DEBUG,
|
guac_client_abort(client,
|
||||||
|
GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||||
"Error handling RDP channel file descriptors");
|
"Error handling RDP channel file descriptors");
|
||||||
pthread_mutex_unlock(&(rdp_client->rdp_lock));
|
pthread_mutex_unlock(&(rdp_client->rdp_lock));
|
||||||
return 1;
|
return 1;
|
||||||
@ -837,6 +839,7 @@ static int guac_rdp_handle_connection(guac_client* client) {
|
|||||||
|
|
||||||
/* Handle RDP disconnect */
|
/* Handle RDP disconnect */
|
||||||
if (freerdp_shall_disconnect(rdp_inst)) {
|
if (freerdp_shall_disconnect(rdp_inst)) {
|
||||||
|
guac_client_stop(client);
|
||||||
guac_client_log(client, GUAC_LOG_INFO,
|
guac_client_log(client, GUAC_LOG_INFO,
|
||||||
"RDP server closed connection");
|
"RDP server closed connection");
|
||||||
pthread_mutex_unlock(&(rdp_client->rdp_lock));
|
pthread_mutex_unlock(&(rdp_client->rdp_lock));
|
||||||
@ -884,6 +887,8 @@ static int guac_rdp_handle_connection(guac_client* client) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Kill client and finish connection */
|
||||||
|
guac_client_stop(client);
|
||||||
guac_client_log(client, GUAC_LOG_INFO, "Internal RDP client disconnected");
|
guac_client_log(client, GUAC_LOG_INFO, "Internal RDP client disconnected");
|
||||||
|
|
||||||
pthread_mutex_lock(&(rdp_client->rdp_lock));
|
pthread_mutex_lock(&(rdp_client->rdp_lock));
|
||||||
@ -953,8 +958,12 @@ void* guac_rdp_client_thread(void* data) {
|
|||||||
if (settings->enable_sftp) {
|
if (settings->enable_sftp) {
|
||||||
|
|
||||||
/* Abort if username is missing */
|
/* Abort if username is missing */
|
||||||
if (settings->sftp_username == NULL)
|
if (settings->sftp_username == NULL) {
|
||||||
|
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||||
|
"A username or SFTP-specific username is required if "
|
||||||
|
"SFTP is enabled.");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
guac_client_log(client, GUAC_LOG_DEBUG,
|
guac_client_log(client, GUAC_LOG_DEBUG,
|
||||||
"Connecting via SSH for SFTP filesystem access.");
|
"Connecting via SSH for SFTP filesystem access.");
|
||||||
@ -973,6 +982,8 @@ void* guac_rdp_client_thread(void* data) {
|
|||||||
settings->sftp_private_key,
|
settings->sftp_private_key,
|
||||||
settings->sftp_passphrase)) {
|
settings->sftp_passphrase)) {
|
||||||
guac_common_ssh_destroy_user(rdp_client->sftp_user);
|
guac_common_ssh_destroy_user(rdp_client->sftp_user);
|
||||||
|
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||||
|
"Private key unreadable.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1015,6 +1026,8 @@ void* guac_rdp_client_thread(void* data) {
|
|||||||
if (rdp_client->sftp_filesystem == NULL) {
|
if (rdp_client->sftp_filesystem == NULL) {
|
||||||
guac_common_ssh_destroy_session(rdp_client->sftp_session);
|
guac_common_ssh_destroy_session(rdp_client->sftp_session);
|
||||||
guac_common_ssh_destroy_user(rdp_client->sftp_user);
|
guac_common_ssh_destroy_user(rdp_client->sftp_user);
|
||||||
|
guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR,
|
||||||
|
"SFTP connection failed.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,8 +178,11 @@ void* ssh_client_thread(void* data) {
|
|||||||
pthread_t input_thread;
|
pthread_t input_thread;
|
||||||
|
|
||||||
/* Init SSH base libraries */
|
/* Init SSH base libraries */
|
||||||
if (guac_common_ssh_init(client))
|
if (guac_common_ssh_init(client)) {
|
||||||
|
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||||
|
"SSH library initialization failed");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set up screen recording, if requested */
|
/* Set up screen recording, if requested */
|
||||||
if (settings->recording_path != NULL) {
|
if (settings->recording_path != NULL) {
|
||||||
|
@ -241,6 +241,13 @@ void* guac_vnc_client_thread(void* data) {
|
|||||||
/* Connect via SSH if SFTP is enabled */
|
/* Connect via SSH if SFTP is enabled */
|
||||||
if (settings->enable_sftp) {
|
if (settings->enable_sftp) {
|
||||||
|
|
||||||
|
/* Abort if username is missing */
|
||||||
|
if (settings->sftp_username == NULL) {
|
||||||
|
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||||
|
"SFTP username is required if SFTP is enabled.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
guac_client_log(client, GUAC_LOG_DEBUG,
|
guac_client_log(client, GUAC_LOG_DEBUG,
|
||||||
"Connecting via SSH for SFTP filesystem access.");
|
"Connecting via SSH for SFTP filesystem access.");
|
||||||
|
|
||||||
@ -258,6 +265,8 @@ void* guac_vnc_client_thread(void* data) {
|
|||||||
settings->sftp_private_key,
|
settings->sftp_private_key,
|
||||||
settings->sftp_passphrase)) {
|
settings->sftp_passphrase)) {
|
||||||
guac_common_ssh_destroy_user(vnc_client->sftp_user);
|
guac_common_ssh_destroy_user(vnc_client->sftp_user);
|
||||||
|
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||||
|
"Private key unreadable.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,6 +306,8 @@ void* guac_vnc_client_thread(void* data) {
|
|||||||
if (vnc_client->sftp_filesystem == NULL) {
|
if (vnc_client->sftp_filesystem == NULL) {
|
||||||
guac_common_ssh_destroy_session(vnc_client->sftp_session);
|
guac_common_ssh_destroy_session(vnc_client->sftp_session);
|
||||||
guac_common_ssh_destroy_user(vnc_client->sftp_user);
|
guac_common_ssh_destroy_user(vnc_client->sftp_user);
|
||||||
|
guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR,
|
||||||
|
"SFTP connection failed.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,6 +418,8 @@ void* guac_vnc_client_thread(void* data) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Kill client and finish connection */
|
||||||
|
guac_client_stop(client);
|
||||||
guac_client_log(client, GUAC_LOG_INFO, "Internal VNC client disconnected");
|
guac_client_log(client, GUAC_LOG_INFO, "Internal VNC client disconnected");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user