s3: Fix bug 8385
authorVolker Lendecke <vl@samba.org>
Mon, 22 Aug 2011 12:16:26 +0000 (14:16 +0200)
committerJeremy Allison <jra@samba.org>
Thu, 25 Aug 2011 17:39:12 +0000 (19:39 +0200)
Poll and select behave differently regarding error handling. When doing the
connect(2), we can not rely on poll telling us both readability and writability
upon error. Just always try a second connect(2). At least on Linux it returns 0
when it succeeded.

Signed-off-by: Jeremy Allison <jra@samba.org>
Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Thu Aug 25 19:39:12 CEST 2011 on sn-devel-104

lib/async_req/async_sock.c

index 811cf8d6759deb3d4ab8bb32cd383d0b71862664..3c68a1c4dee4d0120c6c358d8711c6db0cd2e1df 100644 (file)
@@ -326,36 +326,24 @@ static void async_connect_connected(struct tevent_context *ev,
                priv, struct tevent_req);
        struct async_connect_state *state =
                tevent_req_data(req, struct async_connect_state);
+       int ret;
 
-       /*
-        * Stevens, Network Programming says that if there's a
-        * successful connect, the socket is only writable. Upon an
-        * error, it's both readable and writable.
-        */
-       if ((flags & (TEVENT_FD_READ|TEVENT_FD_WRITE))
-           == (TEVENT_FD_READ|TEVENT_FD_WRITE)) {
-               int ret;
-
-               ret = connect(state->fd,
-                             (struct sockaddr *)(void *)&state->address,
-                             state->address_len);
-               if (ret == 0) {
-                       TALLOC_FREE(fde);
-                       tevent_req_done(req);
-                       return;
-               }
-
-               if (errno == EINPROGRESS) {
-                       /* Try again later, leave the fde around */
-                       return;
-               }
+       ret = connect(state->fd, (struct sockaddr *)(void *)&state->address,
+                     state->address_len);
+       if (ret == 0) {
+               state->sys_errno = 0;
                TALLOC_FREE(fde);
-               tevent_req_error(req, errno);
+               tevent_req_done(req);
                return;
        }
-
-       state->sys_errno = 0;
-       tevent_req_done(req);
+       if (errno == EINPROGRESS) {
+               /* Try again later, leave the fde around */
+               return;
+       }
+       state->sys_errno = errno;
+       TALLOC_FREE(fde);
+       tevent_req_error(req, errno);
+       return;
 }
 
 int async_connect_recv(struct tevent_req *req, int *perrno)