]> git.mxchange.org Git - simgear.git/commitdiff
Fix a crash where hostlookup fails entirely, thanks to Andreas Gaeb for the catch.
authorJames Turner <zakalawe@mac.com>
Fri, 16 Sep 2011 10:37:02 +0000 (11:37 +0100)
committerJames Turner <zakalawe@mac.com>
Fri, 16 Sep 2011 10:37:02 +0000 (11:37 +0100)
simgear/io/raw_socket.cxx
simgear/io/raw_socket.hxx
simgear/io/sg_netChannel.cxx

index cf7b20f7bf873b869ace2287e9093c3dc68c19cb..bb08aae76a26b1e7f240a89cce4a903473e58827 100644 (file)
@@ -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 ;
index 9450e9eb8729cefe97caeefbfc445172e3a3513d..7a92a9e5fe921e6f5fec31173a2e14766d1ffc3a 100644 (file)
@@ -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 ;
index 86839e71a707384661f9a5555cdd1f7d38e3e0d2..463f24f9d28186210eaa34ac3b4094efc3d085ef 100644 (file)
@@ -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 ) ;