sk_address_is_local() was ignoring the possibility that a SockAddr
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 1 Apr 2005 08:46:26 +0000 (08:46 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 1 Apr 2005 08:46:26 +0000 (08:46 +0000)
might have an IPv4 address in `ai' rather than in `addresses'.
Thanks to Martin Prikryl for pointing this out.

git-svn-id: svn://svn.tartarus.org/sgt/putty@5587 cda61777-01e9-0310-a592-d414129be87e

windows/winnet.c

index 8a7580b..f277e71 100644 (file)
@@ -572,10 +572,18 @@ int sk_address_is_local(SockAddr addr)
     } else
 #endif
     if (addr->family == AF_INET) {
-       struct in_addr a;
-       assert(addr->addresses && addr->curraddr < addr->naddresses);
-       a.s_addr = p_htonl(addr->addresses[addr->curraddr]);
-       return ipv4_is_local_addr(a);
+#ifndef NO_IPV6
+       if (addr->ai) {
+           return ipv4_is_local_addr(((struct sockaddr_in *)addr->ai->ai_addr)
+                                     ->sin_addr);
+       } else
+#endif
+       {
+           struct in_addr a;
+           assert(addr->addresses && addr->curraddr < addr->naddresses);
+           a.s_addr = p_htonl(addr->addresses[addr->curraddr]);
+           return ipv4_is_local_addr(a);
+       }
     } else {
        assert(addr->family == AF_UNSPEC);
        return 0;                      /* we don't know; assume not */