summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2011-08-22 14:16:26 +0200
committerKarolin Seeger <kseeger@samba.org>2011-09-16 20:42:09 +0200
commite5b338313be19767e4ca085bcd345b392c759ff1 (patch)
tree70c09b85caf1a2c4cdfb125e6f422f9b6631ee19 /lib
parent32618377c50405e7b0dabf9b39f4e7a7c885b6b7 (diff)
downloadsamba-e5b338313be19767e4ca085bcd345b392c759ff1.tar.gz
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 (cherry picked from commit 50e30afa608dfdeae8a260730ead9761ed424dad) (cherry picked from commit 45392d05ff059987fb76d3818969177b5a5de6b0)
Diffstat (limited to 'lib')
-rw-r--r--lib/async_req/async_sock.c40
1 files changed, 14 insertions, 26 deletions
diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c
index 2c90b6dd17b..bb8518f9485 100644
--- a/lib/async_req/async_sock.c
+++ b/lib/async_req/async_sock.c
@@ -325,36 +325,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)