]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
sktree is indexed on the numeric value of the socket structure's
authorSimon Tatham <anakin@pobox.com>
Mon, 26 Nov 2007 21:09:54 +0000 (21:09 +0000)
committerSimon Tatham <anakin@pobox.com>
Mon, 26 Nov 2007 21:09:54 +0000 (21:09 +0000)
underlying WinSock SOCKET. Therefore, if we plan to modify the
SOCKET in a socket, we must remove it from the tree before doing so,
and put it back again afterwards. Otherwise it'll violate the tree's
sorting order, and sooner or later someone will try to find it and
get back NULL.

[originally from svn r7795]

windows/winnet.c

index a5fc383419d6abee981cbeb34764177fcf7b425a..19babb0f499eedb09417de6b6b6c272595ff8b04 100644 (file)
@@ -96,6 +96,10 @@ static int cmpfortree(void *av, void *bv)
        return -1;
     if (as > bs)
        return +1;
+    if (a < b)
+       return -1;
+    if (a > b)
+       return +1;
     return 0;
 }
 
@@ -788,6 +792,14 @@ static DWORD try_connect(Actual_Socket sock)
        family = AF_INET;
     }
 
+    /*
+     * Remove the socket from the tree before we overwrite its
+     * internal socket id, because that forms part of the tree's
+     * sorting criterion. We'll add it back before exiting this
+     * function, whether we changed anything or not.
+     */
+    del234(sktree, sock);
+
     s = p_socket(family, SOCK_STREAM, 0);
     sock->s = s;
 
@@ -932,11 +944,15 @@ static DWORD try_connect(Actual_Socket sock)
        sock->writable = 1;
     }
 
-    add234(sktree, sock);
-
     err = 0;
 
     ret:
+
+    /*
+     * No matter what happened, put the socket back in the tree.
+     */
+    add234(sktree, sock);
+
     if (err)
        plug_log(sock->plug, 1, sock->addr, sock->port, sock->error, err);
     return err;