From 403b7c14aaf57e3918636344d979a0190a21a4ab Mon Sep 17 00:00:00 2001 From: James Turner Date: Fri, 16 Sep 2011 11:37:02 +0100 Subject: [PATCH] Fix a crash where hostlookup fails entirely, thanks to Andreas Gaeb for the catch. --- simgear/io/raw_socket.cxx | 31 ++++++++++++++++++++++++++++++- simgear/io/raw_socket.hxx | 1 + simgear/io/sg_netChannel.cxx | 8 ++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/simgear/io/raw_socket.cxx b/simgear/io/raw_socket.cxx index cf7b20f7..bb08aae7 100644 --- a/simgear/io/raw_socket.cxx +++ b/simgear/io/raw_socket.cxx @@ -311,6 +311,10 @@ bool IPAddress::lookupNonblocking(const char* host, IPAddress& addr) const char* IPAddress::getHost () const { + if (!addr) { + return NULL; + } + static char buf [32]; long x = ntohl(addr->sin_addr.s_addr); sprintf(buf, "%d.%d.%d.%d", @@ -321,21 +325,37 @@ const char* IPAddress::getHost () const unsigned int IPAddress::getIP () const { + if (!addr) { + return 0; + } + return addr->sin_addr.s_addr; } unsigned int IPAddress::getPort() const { + if (!addr) { + return 0; + } + return ntohs(addr->sin_port); } void IPAddress::setPort(int port) { + if (!addr) { + return; + } + addr->sin_port = htons(port); } unsigned int IPAddress::getFamily () const { + if (!addr) { + return 0; + } + return addr->sin_family; } @@ -363,7 +383,11 @@ const char* IPAddress::getLocalHost () bool IPAddress::getBroadcast () const { - return (addr->sin_addr.s_addr == INADDR_BROADCAST); + if (!addr) { + return false; + } + + return (addr->sin_addr.s_addr == INADDR_BROADCAST); } unsigned int IPAddress::getAddrLen() const @@ -381,6 +405,11 @@ struct sockaddr* IPAddress::getAddr() const return (struct sockaddr*) addr; } +bool IPAddress::isValid() const +{ + return (addr != NULL); +} + Socket::Socket () { handle = -1 ; diff --git a/simgear/io/raw_socket.hxx b/simgear/io/raw_socket.hxx index 9450e9eb..7a92a9e5 100644 --- a/simgear/io/raw_socket.hxx +++ b/simgear/io/raw_socket.hxx @@ -51,6 +51,7 @@ public: IPAddress( const IPAddress& other ); const IPAddress& operator=(const IPAddress& other); + bool isValid () const; void set ( const char* host, int port ) ; const char* getHost () const ; unsigned int getPort() const ; diff --git a/simgear/io/sg_netChannel.cxx b/simgear/io/sg_netChannel.cxx index 86839e71..463f24f9 100644 --- a/simgear/io/sg_netChannel.cxx +++ b/simgear/io/sg_netChannel.cxx @@ -209,6 +209,14 @@ NetChannel::handleResolve() return 0; // not looked up yet, wait longer } + if (!addr.isValid()) { + // I'm absuing ENETUNREACH, all we do is pass this to strerror + // in handleError + handleError (ENETUNREACH); + close(); + return -1; + } + resolving_host = false; addr.setPort(port); int result = Socket::connect ( &addr ) ; -- 2.39.5