From 9f174ea8644562eed791e7e2bc62e9a9b2b07393 Mon Sep 17 00:00:00 2001 From: Henrik Andersson Date: Thu, 22 Nov 2012 13:38:35 +0000 Subject: [PATCH] Added check if socket is connected to prevent sending disconnect sequence to a closed socket. git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/rdesktop/trunk@1681 423420c4-83ab-492f-b58f-81f9feb106b5 --- proto.h | 1 + rdesktop.c | 3 ++- tcp.c | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/proto.h b/proto.h index e6a2fb7..4e9188b 100644 --- a/proto.h +++ b/proto.h @@ -207,6 +207,7 @@ STREAM tcp_recv(STREAM s, uint32 length); RD_BOOL tcp_connect(char *server); void tcp_disconnect(void); char *tcp_get_address(void); +RD_BOOL tcp_is_connected(void); void tcp_reset_state(void); RD_BOOL tcp_tls_connect(void); RD_BOOL tcp_tls_get_server_pubkey(STREAM s); diff --git a/rdesktop.c b/rdesktop.c index 28c545e..1f801dc 100644 --- a/rdesktop.c +++ b/rdesktop.c @@ -1023,7 +1023,8 @@ main(int argc, char *argv[]) rdp_main_loop(&deactivated, &ext_disc_reason); DEBUG(("Disconnecting...\n")); - rdp_disconnect(); + if (!tcp_is_connected()) + rdp_disconnect(); if (g_redirect) continue; diff --git a/tcp.c b/tcp.c index 2237f7b..f11bf64 100644 --- a/tcp.c +++ b/tcp.c @@ -515,6 +515,16 @@ tcp_get_address() return ipaddr; } +RD_BOOL +tcp_is_connected() +{ + struct sockaddr_in sockaddr; + socklen_t len = sizeof(sockaddr); + if (getpeername(g_sock, (struct sockaddr *) &sockaddr, &len)) + return True; + return False; +} + /* reset the state of the tcp layer */ /* Support for Session Directory */ void