Fix [ 1001018 ]: Windows: setdefaulttimeout causes unnecessary timeouts on
connect error
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 86190f3..757dcc6 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -1694,17 +1694,38 @@
 		if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
 			/* This is a mess.  Best solution: trust select */
 			fd_set fds;
+			fd_set fds_exc;
 			struct timeval tv;
 			tv.tv_sec = (int)s->sock_timeout;
 			tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
 			FD_ZERO(&fds);
 			FD_SET(s->sock_fd, &fds);
-			res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
+			FD_ZERO(&fds_exc);
+			FD_SET(s->sock_fd, &fds_exc);
+			res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
 			if (res == 0) {
 				res = WSAEWOULDBLOCK;
 				timeout = 1;
-			} else if (res > 0)
-				res = 0;
+			} else if (res > 0) {
+				if (FD_ISSET(s->sock_fd, &fds))
+					/* The socket is in the writeable set - this
+					   means connected */
+					res = 0;
+				else {
+					/* As per MS docs, we need to call getsockopt()
+					   to get the underlying error */
+					int res_size = sizeof res;
+					/* It must be in the exception set */
+					assert(FD_ISSET(s->sock_fd, &fds_exc));
+					if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, 
+					                    (char *)&res, &res_size))
+						/* getsockopt also clears WSAGetLastError,
+						   so reset it back. */
+						WSASetLastError(res);
+					else
+						res = WSAGetLastError();
+				}
+			}
 			/* else if (res < 0) an error occurred */
 		}
 	}