If a new session was saved from Change Settings, a side-effect on Windows was
[u/mdw/putty] / windows / winnet.c
index 85e7d0c..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 */
@@ -1516,9 +1524,12 @@ static void sk_tcp_set_frozen(Socket sock, int is_frozen)
     if (s->frozen == is_frozen)
        return;
     s->frozen = is_frozen;
-    if (!is_frozen && s->frozen_readable) {
-       char c;
-       p_recv(s->s, &c, 1, MSG_PEEK);
+    if (!is_frozen) {
+       do_select(s->s, 1);
+       if (s->frozen_readable) {
+           char c;
+           p_recv(s->s, &c, 1, MSG_PEEK);
+       }
     }
     s->frozen_readable = 0;
 }