]> source.dussan.org Git - tigervnc.git/commitdiff
Properly report connect error codes
authorPierre Ossman <ossman@cendio.se>
Thu, 30 Jul 2015 10:24:36 +0000 (12:24 +0200)
committerPierre Ossman <ossman@cendio.se>
Thu, 30 Jul 2015 10:24:36 +0000 (12:24 +0200)
The logic was flawed and would treat all connect errors as
if there were no addresses found.

common/network/TcpSocket.cxx

index 1ebaeecba673fe779ca36538327bf2349ac968e4..684ff8b345165313b89fbd68d398ae33aab15d9a 100644 (file)
@@ -145,9 +145,7 @@ TcpSocket::TcpSocket(int sock, bool close)
 TcpSocket::TcpSocket(const char *host, int port)
   : closeFd(true)
 {
-  int sock, err, result, family;
-  vnc_sockaddr_t sa;
-  socklen_t salen;
+  int sock, err, result;
   struct addrinfo *ai, *current, hints;
 
   // - Create a socket
@@ -165,11 +163,13 @@ TcpSocket::TcpSocket(const char *host, int port)
                     gai_strerror(result));
   }
 
-  // This logic is too complex for the compiler to determine if
-  // sock is properly assigned or not.
   sock = -1;
-
+  err = 0;
   for (current = ai; current != NULL; current = current->ai_next) {
+    int family;
+    vnc_sockaddr_t sa;
+    socklen_t salen;
+
     family = current->ai_family;
 
     switch (family) {
@@ -208,6 +208,7 @@ TcpSocket::TcpSocket(const char *host, int port)
         continue;
 #endif
       closesocket(sock);
+      sock = -1;
       break;
     }
 
@@ -217,11 +218,12 @@ TcpSocket::TcpSocket(const char *host, int port)
 
   freeaddrinfo(ai);
 
-  if (current == NULL)
-    throw Exception("No useful address for host");
-
-  if (result == -1)
-    throw SocketException("unable connect to socket", err);
+  if (sock == -1) {
+    if (err == 0)
+      throw Exception("No useful address for host");
+    else
+      throw SocketException("unable connect to socket", err);
+  }
 
 #ifndef WIN32
   // - By default, close the socket on exec()