The branch, master has been updated
       via  6fc65aa lib: Fix rundown of open_socket_out()
      from  36272ac selftest: skip the ntvfs based base.defer_open tests

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6fc65aaf956f35e2068e2a6f8521af2f2351d31e
Author: Volker Lendecke <[email protected]>
Date:   Mon Jun 29 19:00:55 2015 +0200

    lib: Fix rundown of open_socket_out()
    
    Under valgrind I've seen the abort in async_connect_cleanup kick in. Yes, 
it's
    good that we check these return codes!
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=11316
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: "Stefan (metze) Metzmacher" <[email protected]>
    
    Autobuild-User(master): Volker Lendecke <[email protected]>
    Autobuild-Date(master): Tue Jun 30 20:24:37 CEST 2015 on sn-devel-104

-----------------------------------------------------------------------

Summary of changes:
 source3/lib/util_sock.c | 45 +++++++++++++++++++++++++++++++++------------
 1 file changed, 33 insertions(+), 12 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index c4de85d..a8a9cca 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -418,16 +418,34 @@ struct open_socket_out_state {
        socklen_t salen;
        uint16_t port;
        int wait_usec;
+       struct tevent_req *connect_subreq;
 };
 
 static void open_socket_out_connected(struct tevent_req *subreq);
 
-static int open_socket_out_state_destructor(struct open_socket_out_state *s)
+static void open_socket_out_cleanup(struct tevent_req *req,
+                                   enum tevent_req_state req_state)
 {
-       if (s->fd != -1) {
-               close(s->fd);
+       struct open_socket_out_state *state =
+               tevent_req_data(req, struct open_socket_out_state);
+
+       /*
+        * Make sure that the async_connect_send subreq has a chance to reset
+        * fcntl before the socket goes away.
+        */
+       TALLOC_FREE(state->connect_subreq);
+
+       if (req_state == TEVENT_REQ_DONE) {
+               /*
+                * we keep the socket open for the caller to use
+                */
+               return;
+       }
+
+       if (state->fd != -1) {
+               close(state->fd);
+               state->fd = -1;
        }
-       return 0;
 }
 
 /****************************************************************************
@@ -441,7 +459,7 @@ struct tevent_req *open_socket_out_send(TALLOC_CTX *mem_ctx,
                                        int timeout)
 {
        char addr[INET6_ADDRSTRLEN];
-       struct tevent_req *result, *subreq;
+       struct tevent_req *result;
        struct open_socket_out_state *state;
        NTSTATUS status;
 
@@ -461,7 +479,8 @@ struct tevent_req *open_socket_out_send(TALLOC_CTX *mem_ctx,
                status = map_nt_error_from_unix(errno);
                goto post_status;
        }
-       talloc_set_destructor(state, open_socket_out_state_destructor);
+
+       tevent_req_set_cleanup_fn(result, open_socket_out_cleanup);
 
        if (!tevent_req_set_endtime(
                    result, ev, timeval_current_ofs_msec(timeout))) {
@@ -495,16 +514,17 @@ struct tevent_req *open_socket_out_send(TALLOC_CTX 
*mem_ctx,
        print_sockaddr(addr, sizeof(addr), &state->ss);
        DEBUG(3,("Connecting to %s at port %u\n", addr, (unsigned int)port));
 
-       subreq = async_connect_send(state, state->ev, state->fd,
-                                   (struct sockaddr *)&state->ss,
-                                   state->salen, NULL, NULL, NULL);
-       if ((subreq == NULL)
+       state->connect_subreq = async_connect_send(
+               state, state->ev, state->fd, (struct sockaddr *)&state->ss,
+               state->salen, NULL, NULL, NULL);
+       if ((state->connect_subreq == NULL)
            || !tevent_req_set_endtime(
-                   subreq, state->ev,
+                   state->connect_subreq, state->ev,
                    timeval_current_ofs(0, state->wait_usec))) {
                goto fail;
        }
-       tevent_req_set_callback(subreq, open_socket_out_connected, result);
+       tevent_req_set_callback(state->connect_subreq,
+                               open_socket_out_connected, result);
        return result;
 
  post_status:
@@ -526,6 +546,7 @@ static void open_socket_out_connected(struct tevent_req 
*subreq)
 
        ret = async_connect_recv(subreq, &sys_errno);
        TALLOC_FREE(subreq);
+       state->connect_subreq = NULL;
        if (ret == 0) {
                tevent_req_done(req);
                return;


-- 
Samba Shared Repository

Reply via email to