Fix a segfault (addr->error was unpredictable following a dotted-dec lookup)
[u/mdw/putty] / winnet.c
index ad43853..e36d9e1 100644 (file)
--- a/winnet.c
+++ b/winnet.c
@@ -5,6 +5,7 @@
 #include <windows.h>
 #include <winsock.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 #include "putty.h"
 #include "network.h"
@@ -60,6 +61,7 @@ SockAddr sk_namelookup(char *host, char **canonicalname) {
     unsigned long a;
     struct hostent *h;
 
+    ret->error = NULL;
     if ( (a = inet_addr(host)) == (unsigned long) INADDR_NONE) {
        if ( (h = gethostbyname(host)) == NULL) {
            DWORD err = WSAGetLastError();
@@ -68,7 +70,6 @@ SockAddr sk_namelookup(char *host, char **canonicalname) {
                          err == WSATRY_AGAIN ? "Host not found" :
                          "gethostbyname: unknown error");
        } else {
-           ret->error = NULL;
            memcpy (&a, h->h_addr, sizeof(a));
            *canonicalname = h->h_name;
        }
@@ -101,6 +102,7 @@ Socket sk_new(SockAddr addr, int port, sk_receiver_t receiver) {
     ret->head = ret->tail = NULL;
     ret->writable = 1;                /* to start with */
     ret->in_oob = FALSE;
+    ret->sending_oob = 0;
 
     /*
      * Open socket.
@@ -224,6 +226,7 @@ void try_send(Socket s) {
         }
 
        nsent = send(s->s, s->head->buf + s->head->bufpos, len, urgentflag);
+        noise_ultralight(nsent);
        if (nsent <= 0) {
            err = (nsent < 0 ? WSAGetLastError() : 0);
            if (err == WSAEWOULDBLOCK) {
@@ -334,7 +337,7 @@ int select_result(WPARAM wParam, LPARAM lParam) {
     DWORD err;
     char buf[BUFFER_GRANULE];
     Socket s;
-    int atmark;
+    u_long atmark;
 
     /* wParam is the socket itself */
     s = find234(sktree, (void *)wParam, cmpforsearch);
@@ -345,6 +348,8 @@ int select_result(WPARAM wParam, LPARAM lParam) {
        fatalbox(winsock_error_string(err));
     }
 
+    noise_ultralight(lParam);
+
     switch (WSAGETSELECTEVENT(lParam)) {
       case FD_READ:
        ret = recv(s->s, buf, sizeof(buf), 0);
@@ -375,6 +380,7 @@ int select_result(WPARAM wParam, LPARAM lParam) {
          * which is good enough to keep going at least. */
         ioctlsocket(s->s, SIOCATMARK, &atmark);
         ret = recv(s->s, buf, sizeof(buf), MSG_OOB);
+        noise_ultralight(ret);
         if (ret <= 0) {
             fatalbox(ret == 0 ? "Internal networking trouble" :
                      winsock_error_string(WSAGetLastError()));