BUG_SSH2_DERIVEKEY is apparently only present in SSH 2.0.11 and
[u/mdw/putty] / winnet.c
index 7cadf86..b5ca741 100644 (file)
--- a/winnet.c
+++ b/winnet.c
@@ -370,7 +370,7 @@ void sk_getaddr(SockAddr addr, char *buf, int buflen)
 
 int sk_addrtype(SockAddr addr)
 {
-    return addr->family;
+    return (addr->family == AF_INET ? ADDRTYPE_IPV4 : ADDRTYPE_IPV6);
 }
 
 void sk_addrcopy(SockAddr addr, char *buf)
@@ -833,7 +833,9 @@ void try_send(Actual_Socket s)
                s->pending_error = err;
                return;
            } else {
-               logevent(winsock_error_string(err));
+               /* We're inside the Windows frontend here, so we know
+                * that the frontend handle is unnecessary. */
+               logevent(NULL, winsock_error_string(err));
                fatalbox("%s", winsock_error_string(err));
            }
        } else {
@@ -899,6 +901,25 @@ int select_result(WPARAM wParam, LPARAM lParam)
     u_long atmark;
 
     /* wParam is the socket itself */
+
+    /*
+     * One user has reported an assertion failure in tree234 which
+     * indicates a null element pointer has been passed to a
+     * find*234 function. The following find234 is the only one in
+     * the whole program that I can see being capable of doing
+     * this, hence I'm forced to conclude that WinSock is capable
+     * of sending me netevent messages with wParam==0. I want to
+     * know what the rest of the message is if it does so!
+     */
+    if (wParam == 0) {
+       char *str;
+       str = dupprintf("Strange WinSock message: wp=%08x lp=%08x",
+                       (int)wParam, (int)lParam);
+       logevent(NULL, str);
+       connection_fatal(NULL, str);
+       sfree(str);
+    }
+
     s = find234(sktree, (void *) wParam, cmpforsearch);
     if (!s)
        return 1;                      /* boggle */
@@ -972,7 +993,9 @@ int select_result(WPARAM wParam, LPARAM lParam)
        if (ret <= 0) {
            char *str = (ret == 0 ? "Internal networking trouble" :
                         winsock_error_string(WSAGetLastError()));
-           logevent(str);
+           /* We're inside the Windows frontend here, so we know
+            * that the frontend handle is unnecessary. */
+           logevent(NULL, str);
            fatalbox("%s", str);
        } else {
            return plug_receive(s->plug, 2, buf, ret);
@@ -1134,3 +1157,13 @@ SOCKET next_socket(int *state)
     Actual_Socket s = index234(sktree, (*state)++);
     return s ? s->s : INVALID_SOCKET;
 }
+
+int net_service_lookup(char *service)
+{
+    struct servent *se;
+    se = getservbyname(service, NULL);
+    if (se != NULL)
+       return ntohs(se->s_port);
+    else
+       return 0;
+}