async_req: make async_connect_send() "reentrant"
authorRalph Boehme <slow@samba.org>
Wed, 3 Aug 2016 13:00:45 +0000 (15:00 +0200)
committerRalph Boehme <slow@samba.org>
Thu, 4 Aug 2016 03:03:21 +0000 (05:03 +0200)
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

lib/async_req/async_sock.c

index c14acf3fd62ec858bca38a61772246fd39f12c3f..3af17484a2bd72585a78b0d93f06139b5c93dca2 100644 (file)
@@ -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);
        }