diff options
author | Volker Lendecke <vl@samba.org> | 2011-08-22 14:16:26 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2011-08-25 19:39:12 +0200 |
commit | 50e30afa608dfdeae8a260730ead9761ed424dad (patch) | |
tree | 0c8ea814fb1a46bbed4e275af27e7471b63ca828 | |
parent | 1593654914afacbeb529b64711eedb19edf14bdc (diff) | |
download | samba-50e30afa608dfdeae8a260730ead9761ed424dad.tar.gz samba-50e30afa608dfdeae8a260730ead9761ed424dad.tar.bz2 samba-50e30afa608dfdeae8a260730ead9761ed424dad.zip |
s3: Fix bug 8385
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
-rw-r--r-- | lib/async_req/async_sock.c | 40 |
1 files changed, 14 insertions, 26 deletions
diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c index 811cf8d675..3c68a1c4de 100644 --- a/lib/async_req/async_sock.c +++ b/lib/async_req/async_sock.c @@ -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) |