lib/async_req: remove the tevent_fd as early as possible via a wait_for_read_cleanup...
authorStefan Metzmacher <metze@samba.org>
Thu, 21 May 2015 20:28:14 +0000 (22:28 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 12 Jun 2015 15:08:18 +0000 (17:08 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=11316

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
lib/async_req/async_sock.c

index adb8f87d0ccf2e78b777b21560e1f84538e014f6..03bda588661e67e3d77276c4a8a654e665583e70 100644 (file)
@@ -522,10 +522,11 @@ ssize_t read_packet_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
 }
 
 struct wait_for_read_state {
-       struct tevent_req *req;
        struct tevent_fd *fde;
 };
 
+static void wait_for_read_cleanup(struct tevent_req *req,
+                                 enum tevent_req_state req_state);
 static void wait_for_read_done(struct tevent_context *ev,
                               struct tevent_fd *fde,
                               uint16_t flags,
@@ -542,36 +543,47 @@ struct tevent_req *wait_for_read_send(TALLOC_CTX *mem_ctx,
        if (req == NULL) {
                return NULL;
        }
-       state->req = req;
+
+       tevent_req_set_cleanup_fn(req, wait_for_read_cleanup);
+
        state->fde = tevent_add_fd(ev, state, fd, TEVENT_FD_READ,
-                                  wait_for_read_done, state);
+                                  wait_for_read_done, req);
        if (tevent_req_nomem(state->fde, req)) {
                return tevent_req_post(req, ev);
        }
        return req;
 }
 
+static void wait_for_read_cleanup(struct tevent_req *req,
+                                 enum tevent_req_state req_state)
+{
+       struct wait_for_read_state *state =
+               tevent_req_data(req, struct wait_for_read_state);
+
+       TALLOC_FREE(state->fde);
+}
+
 static void wait_for_read_done(struct tevent_context *ev,
                               struct tevent_fd *fde,
                               uint16_t flags,
                               void *private_data)
 {
-       struct wait_for_read_state *state = talloc_get_type_abort(
-               private_data, struct wait_for_read_state);
+       struct tevent_req *req = talloc_get_type_abort(
+               private_data, struct tevent_req);
 
        if (flags & TEVENT_FD_READ) {
-               TALLOC_FREE(state->fde);
-               tevent_req_done(state->req);
+               tevent_req_done(req);
        }
 }
 
 bool wait_for_read_recv(struct tevent_req *req, int *perr)
 {
-       int err;
+       int err = tevent_req_simple_recv_unix(req);
 
-       if (tevent_req_is_unix_error(req, &err)) {
+       if (err != 0) {
                *perr = err;
                return false;
        }
+
        return true;
 }