summaryrefslogtreecommitdiff
path: root/lib/async_req
diff options
context:
space:
mode:
authorRalph Boehme <slow@samba.org>2016-08-03 15:00:45 +0200
committerRalph Boehme <slow@samba.org>2016-08-04 05:03:21 +0200
commit9c6a4ea2788808bdcc7bfea798d838ea56c3b5ec (patch)
tree948ac387fdc4ff0cb928af75e4af12db6e6a64f0 /lib/async_req
parent065dcc8a45fa77b00355b61a8f25d046c9d349cf (diff)
downloadsamba-9c6a4ea2788808bdcc7bfea798d838ea56c3b5ec.tar.gz
async_req: make async_connect_send() "reentrant"
Allow callers to pass in socket fds that where already passed to an earlier call of async_connect_send(). Callers expect this behaviour and it was working until 05d4dbda8357712cb81008e0d611fdb0e7239587 broke it. The proper fix would be to change callers to close the fd and start from scratch with a fresh socket. Bug: https://bugzilla.samba.org/show_bug.cgi?id=12105 Signed-off-by: Ralph Boehme <slow@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Ralph Böhme <slow@samba.org> Autobuild-Date(master): Thu Aug 4 05:03:21 CEST 2016 on sn-devel-144
Diffstat (limited to 'lib/async_req')
-rw-r--r--lib/async_req/async_sock.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c
index c14acf3fd62..3af17484a2b 100644
--- a/lib/async_req/async_sock.c
+++ b/lib/async_req/async_sock.c
@@ -128,11 +128,21 @@ struct tevent_req *async_connect_send(
}
/*
- * The only errno indicating that the connect is still in
- * flight is EINPROGRESS, everything else is an error
+ * The only errno indicating that an initial connect is still
+ * in flight is EINPROGRESS.
+ *
+ * We get EALREADY when someone calls us a second time for a
+ * given fd and the connect is still in flight (and returned
+ * EINPROGRESS the first time).
+ *
+ * This allows callers like open_socket_out_send() to reuse
+ * fds and call us with an fd for which the connect is still
+ * in flight. The proper thing to do for callers would be
+ * closing the fd and starting from scratch with a fresh
+ * socket.
*/
- if (errno != EINPROGRESS) {
+ if (errno != EINPROGRESS && errno != EALREADY) {
tevent_req_error(req, errno);
return tevent_req_post(req, ev);
}