[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Fri Jan 17 06:35:03 MST 2014


The branch, master has been updated
       via  741cb24 s3:lib/tldap: make use of tevent_req_set_cleanup_fn()
       via  5fd9eab s3:lib/tldap: make use of tevent_req_defer_callback()
       via  c84fe17 s3:lib/fncall: make use of tevent_req_set_cleanup_fn()
       via  f08c0b2 libcli/smb: make use of tevent_req_set_cleanup_fn()
       via  c4c88d1 tevent: version 0.9.21
       via  50b9f15 tevent: add tevent_req_set_cleanup_fn()
       via  0ed93e0 tevent: add/use tevent_req_destructor
       via  7502a30 tevent: add doxygen comments for tevent_num_signals() and tevent_sa_info_queue_count()
       via  fd80e54 tevent: Add prototypes
       via  e7d4b7d tevent: Only build "std_fallback_to_poll" when epoll is around
       via  7fe5584 tevent: fix crash bug in tevent_queue_immediate_trigger()
      from  b7bfe46 ctdb/eventscripts: Move all eventscript state under $CTDB_VARDIR/state

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


- Log -----------------------------------------------------------------
commit 741cb24f7a953498940d7b3ada6cb5538ec590fd
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jan 8 10:31:15 2014 +0100

    s3:lib/tldap: make use of tevent_req_set_cleanup_fn()
    
    This is more better than a custom tevent_req destructor.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Fri Jan 17 14:34:06 CET 2014 on sn-devel-104

commit 5fd9eab20fc48f84c2ab389f91ae11d65361ccf5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jan 8 19:46:01 2014 +0100

    s3:lib/tldap: make use of tevent_req_defer_callback()
    
    In tldap_msg_received() we call tevent_req_error() for more than
    one request, if we do that we need to use tevent_req_defer_callback()
    otherwise we're likely to crash, as a triggered callback may
    invalidate our state.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit c84fe17ba954d2784cc1ac5f9e1f3a8302ca951d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jan 8 10:31:15 2014 +0100

    s3:lib/fncall: make use of tevent_req_set_cleanup_fn()
    
    This is more better than a custom tevent_req destructor.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit f08c0b2ef1bb92928ae86ba9d1c276a8e117367c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jan 8 10:31:15 2014 +0100

    libcli/smb: make use of tevent_req_set_cleanup_fn()
    
    This is more better than a custom tevent_req destructor.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit c4c88d1ee8960ae0d8a392821cf4f218725ab660
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Sep 27 04:06:00 2013 +0200

    tevent: version 0.9.21
    
    This fixes a the following bugs:
    - fix a crash bug in tevent_queue_immediate_trigger()
    - add missing tevent_num_signals() and
      tevent_sa_info_queue_count() prototypes
      including documentation.
    
    This adds the following new features:
    
    - tevent_req_set_cleanup_fn()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 50b9f154d22f5c356e66bba341e9ee0292218cfd
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Sep 27 02:29:57 2013 +0200

    tevent: add tevent_req_set_cleanup_fn()
    
    Note that some callers used their own destructor for their
    tevent_req instance, they'll just overwrite this,
    which is not intended, but works without problems.
    
    The intended way is to specify a cleanup function
    and handle the TEVENT_REQ_RECEIVED state as destructor.
    
    Note that the TEVENT_REQ_RECEIVED cleanup event might
    be triggered by an explicit tevent_req_received()
    in the _recv() function. The TEVENT_REQ_RECEIVED event
    is only triggered once as tevent_req_received()
    will remove the destructor.
    
    So the difference compared to a custom destructor
    is that the struct tevent_req itself can continue
    to be there, while tevent_req_received() removed
    all internal state.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 0ed93e099af833045d9d00b9a8faeb5b93b6ef2e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Sep 27 03:41:29 2013 +0200

    tevent: add/use tevent_req_destructor
    
    This makes sure we call tevent_req_received(req) on talloc_free()
    and cleanup things in a defined order.
    
    Note that some callers used their own destructor for their
    tevent_req instance, they'll just overwrite this,
    which is not intended, but works without problems.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 7502a309e8b817036c1ddc38740c214ae416bf29
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jan 8 10:01:56 2014 +0100

    tevent: add doxygen comments for tevent_num_signals() and tevent_sa_info_queue_count()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit fd80e544169db5fb86288b7b22da4e98a88f4477
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Dec 13 11:59:04 2013 +0100

    tevent: Add prototypes
    
    ... doxygen docs to be filled in :-)
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit e7d4b7deda2fac7a7dd86dad84bafcae8085ff80
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Dec 13 11:59:43 2013 +0100

    tevent: Only build "std_fallback_to_poll" when epoll is around
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 7fe5584e2a59584431cb2ddf8a4da22bfb924454
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Jan 11 08:58:05 2014 +0100

    tevent: fix crash bug in tevent_queue_immediate_trigger()
    
    Assume we we have a queue with 2 entries (A and B with triggerA() and triggerB()).
    If triggerA() removes itself tevent_queue_entry_destructor() will be called
    for A, this schedules the immediate event to call triggerB().
    If triggerA() then also removes B by an explicit of implizit talloc_free(),
    q->list is NULL, but the immediate event is still scheduled and can't be unscheduled.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

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

Summary of changes:
 .../ABI/{tevent-0.9.20.sigs => tevent-0.9.21.sigs} |    1 +
 lib/tevent/tevent.h                                |   62 ++++++++++++++++++++
 lib/tevent/tevent_internal.h                       |   12 ++++
 lib/tevent/tevent_queue.c                          |    4 +
 lib/tevent/tevent_req.c                            |   45 ++++++++++++++-
 lib/tevent/tevent_standard.c                       |    2 +
 lib/tevent/wscript                                 |    2 +-
 libcli/smb/smbXcli_base.c                          |   26 +++++---
 source3/lib/fncall.c                               |   23 +++++--
 source3/lib/tldap.c                                |   22 +++++--
 10 files changed, 173 insertions(+), 26 deletions(-)
 copy lib/tevent/ABI/{tevent-0.9.20.sigs => tevent-0.9.21.sigs} (98%)


Changeset truncated at 500 lines:

diff --git a/lib/tevent/ABI/tevent-0.9.20.sigs b/lib/tevent/ABI/tevent-0.9.21.sigs
similarity index 98%
copy from lib/tevent/ABI/tevent-0.9.20.sigs
copy to lib/tevent/ABI/tevent-0.9.21.sigs
index 7b9c77d..d8b9f4b 100644
--- a/lib/tevent/ABI/tevent-0.9.20.sigs
+++ b/lib/tevent/ABI/tevent-0.9.21.sigs
@@ -65,6 +65,7 @@ tevent_req_print: char *(TALLOC_CTX *, struct tevent_req *)
 tevent_req_received: void (struct tevent_req *)
 tevent_req_set_callback: void (struct tevent_req *, tevent_req_fn, void *)
 tevent_req_set_cancel_fn: void (struct tevent_req *, tevent_req_cancel_fn)
+tevent_req_set_cleanup_fn: void (struct tevent_req *, tevent_req_cleanup_fn)
 tevent_req_set_endtime: bool (struct tevent_req *, struct tevent_context *, struct timeval)
 tevent_req_set_print_fn: void (struct tevent_req *, tevent_req_print_fn)
 tevent_sa_info_queue_count: size_t (void)
diff --git a/lib/tevent/tevent.h b/lib/tevent/tevent.h
index 0705ff3..c54cbe2 100644
--- a/lib/tevent/tevent.h
+++ b/lib/tevent/tevent.h
@@ -319,6 +319,8 @@ void _tevent_schedule_immediate(struct tevent_immediate *im,
  *
  * @note To cancel a signal handler, call talloc_free() on the event returned
  * from this function.
+ *
+ * @see tevent_num_signals, tevent_sa_info_queue_count
  */
 struct tevent_signal *tevent_add_signal(struct tevent_context *ev,
                      TALLOC_CTX *mem_ctx,
@@ -340,6 +342,31 @@ struct tevent_signal *_tevent_add_signal(struct tevent_context *ev,
 			   #handler, __location__)
 #endif
 
+/**
+ * @brief the number of supported signals
+ *
+ * This returns value of the configure time TEVENT_NUM_SIGNALS constant.
+ *
+ * The 'signum' argument of tevent_add_signal() must be less than
+ * TEVENT_NUM_SIGNALS.
+ *
+ * @see tevent_add_signal
+ */
+size_t tevent_num_signals(void);
+
+/**
+ * @brief the number of pending realtime signals
+ *
+ * This returns value of TEVENT_SA_INFO_QUEUE_COUNT.
+ *
+ * The tevent internals remember the last TEVENT_SA_INFO_QUEUE_COUNT
+ * siginfo_t structures for SA_SIGINFO signals. If the system generates
+ * more some signals get lost.
+ *
+ * @see tevent_add_signal
+ */
+size_t tevent_sa_info_queue_count(void);
+
 #ifdef DOXYGEN
 /**
  * @brief Pass a single time through the mainloop
@@ -907,6 +934,41 @@ bool _tevent_req_cancel(struct tevent_req *req, const char *location);
 	_tevent_req_cancel(req, __location__)
 #endif
 
+/**
+ * @brief A typedef for a cleanup function for a tevent request.
+ *
+ * @param[in]  req       The tevent request calling this function.
+ *
+ * @param[in]  req_state The current tevent_req_state.
+ *
+ */
+typedef void (*tevent_req_cleanup_fn)(struct tevent_req *req,
+				      enum tevent_req_state req_state);
+
+/**
+ * @brief This function sets a cleanup function for the given tevent request.
+ *
+ * This function can be used to setup a cleanup function for the given request.
+ * This will be triggered when the tevent_req_done() or tevent_req_error()
+ * function was called, before notifying the callers callback function,
+ * and also before scheduling the deferred trigger.
+ *
+ * This might be useful if more than one tevent_req belong together
+ * and need to finish both requests at the same time.
+ *
+ * The cleanup function is able to call tevent_req_done() or tevent_req_error()
+ * recursively, the cleanup function is only triggered the first time.
+ *
+ * The cleanup function is also called by tevent_req_received()
+ * (possibly triggered from tevent_req_destructor()) before destroying
+ * the private data of the tevent_req.
+ *
+ * @param[in]  req      The request to use.
+ *
+ * @param[in]  fn       A pointer to the cancel function.
+ */
+void tevent_req_set_cleanup_fn(struct tevent_req *req, tevent_req_cleanup_fn fn);
+
 #ifdef DOXYGEN
 /**
  * @brief Create an async tevent request.
diff --git a/lib/tevent/tevent_internal.h b/lib/tevent/tevent_internal.h
index df73288..d25dc05 100644
--- a/lib/tevent/tevent_internal.h
+++ b/lib/tevent/tevent_internal.h
@@ -74,6 +74,18 @@ struct tevent_req {
 	tevent_req_cancel_fn private_cancel;
 
 	/**
+	 * @brief A function to cleanup the request
+	 *
+	 * The implementation might want to set a function
+	 * that is called before the tevent_req_done() and tevent_req_error()
+	 * trigger the callers callback function.
+	 */
+	struct {
+		tevent_req_cleanup_fn fn;
+		enum tevent_req_state state;
+	} private_cleanup;
+
+	/**
 	 * @brief Internal state of the request
 	 *
 	 * Callers should only access this via functions and never directly.
diff --git a/lib/tevent/tevent_queue.c b/lib/tevent/tevent_queue.c
index 930319c..35742e5 100644
--- a/lib/tevent/tevent_queue.c
+++ b/lib/tevent/tevent_queue.c
@@ -141,6 +141,10 @@ static void tevent_queue_immediate_trigger(struct tevent_context *ev,
 		return;
 	}
 
+	if (!q->list) {
+		return;
+	}
+
 	q->list->triggered = true;
 	q->list->trigger(q->list->req, q->list->private_data);
 }
diff --git a/lib/tevent/tevent_req.c b/lib/tevent/tevent_req.c
index edb8550..c86fb68 100644
--- a/lib/tevent/tevent_req.c
+++ b/lib/tevent/tevent_req.c
@@ -51,6 +51,8 @@ char *tevent_req_print(TALLOC_CTX *mem_ctx, struct tevent_req *req)
 	return req->private_print(req, mem_ctx);
 }
 
+static int tevent_req_destructor(struct tevent_req *req);
+
 struct tevent_req *_tevent_req_create(TALLOC_CTX *mem_ctx,
 				    void *pdata,
 				    size_t data_size,
@@ -86,10 +88,18 @@ struct tevent_req *_tevent_req_create(TALLOC_CTX *mem_ctx,
 
 	req->data = data;
 
+	talloc_set_destructor(req, tevent_req_destructor);
+
 	*ppdata = data;
 	return req;
 }
 
+static int tevent_req_destructor(struct tevent_req *req)
+{
+	tevent_req_received(req);
+	return 0;
+}
+
 void _tevent_req_notify_callback(struct tevent_req *req, const char *location)
 {
 	req->internal.finish_location = location;
@@ -103,6 +113,24 @@ void _tevent_req_notify_callback(struct tevent_req *req, const char *location)
 	}
 }
 
+static void tevent_req_cleanup(struct tevent_req *req)
+{
+	if (req->private_cleanup.fn == NULL) {
+		return;
+	}
+
+	if (req->private_cleanup.state >= req->internal.state) {
+		/*
+		 * Don't call the cleanup_function multiple times for the same
+		 * state recursively
+		 */
+		return;
+	}
+
+	req->private_cleanup.state = req->internal.state;
+	req->private_cleanup.fn(req, req->internal.state);
+}
+
 static void tevent_req_finish(struct tevent_req *req,
 			      enum tevent_req_state state,
 			      const char *location)
@@ -114,6 +142,10 @@ static void tevent_req_finish(struct tevent_req *req,
 	TALLOC_FREE(req->internal.timer);
 
 	req->internal.state = state;
+	req->internal.finish_location = location;
+
+	tevent_req_cleanup(req);
+
 	_tevent_req_notify_callback(req, location);
 }
 
@@ -200,7 +232,8 @@ bool tevent_req_is_in_progress(struct tevent_req *req)
 
 void tevent_req_received(struct tevent_req *req)
 {
-	TALLOC_FREE(req->data);
+	talloc_set_destructor(req, NULL);
+
 	req->private_print = NULL;
 	req->private_cancel = NULL;
 
@@ -208,6 +241,10 @@ void tevent_req_received(struct tevent_req *req)
 	TALLOC_FREE(req->internal.timer);
 
 	req->internal.state = TEVENT_REQ_RECEIVED;
+
+	tevent_req_cleanup(req);
+
+	TALLOC_FREE(req->data);
 }
 
 bool tevent_req_poll(struct tevent_req *req,
@@ -302,3 +339,9 @@ bool _tevent_req_cancel(struct tevent_req *req, const char *location)
 
 	return req->private_cancel(req);
 }
+
+void tevent_req_set_cleanup_fn(struct tevent_req *req, tevent_req_cleanup_fn fn)
+{
+	req->private_cleanup.state = req->internal.state;
+	req->private_cleanup.fn = fn;
+}
diff --git a/lib/tevent/tevent_standard.c b/lib/tevent/tevent_standard.c
index 785d68d..a050901 100644
--- a/lib/tevent/tevent_standard.c
+++ b/lib/tevent/tevent_standard.c
@@ -54,6 +54,7 @@ static const struct tevent_ops std_event_ops = {
   Move us to using poll instead. If we return false here,
   caller should abort().
 */
+#ifdef HAVE_EPOLL
 static bool std_fallback_to_poll(struct tevent_context *ev, bool replay)
 {
 	void *glue_ptr = talloc_parent(ev->ops);
@@ -100,6 +101,7 @@ static bool std_fallback_to_poll(struct tevent_context *ev, bool replay)
 
 	return true;
 }
+#endif
 
 static int std_event_loop_once(struct tevent_context *ev, const char *location)
 {
diff --git a/lib/tevent/wscript b/lib/tevent/wscript
index 3fc87f5..bd19780 100755
--- a/lib/tevent/wscript
+++ b/lib/tevent/wscript
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 APPNAME = 'tevent'
-VERSION = '0.9.20'
+VERSION = '0.9.21'
 
 blddir = 'bin'
 
diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c
index 082b626..43dd994 100644
--- a/libcli/smb/smbXcli_base.c
+++ b/libcli/smb/smbXcli_base.c
@@ -785,7 +785,7 @@ void smbXcli_req_unset_pending(struct tevent_req *req)
 		return;
 	}
 
-	talloc_set_destructor(req, NULL);
+	tevent_req_set_cleanup_fn(req, NULL);
 
 	if (num_pending == 1) {
 		/*
@@ -828,19 +828,25 @@ void smbXcli_req_unset_pending(struct tevent_req *req)
 	return;
 }
 
-static int smbXcli_req_destructor(struct tevent_req *req)
+static void smbXcli_req_cleanup(struct tevent_req *req,
+				enum tevent_req_state req_state)
 {
 	struct smbXcli_req_state *state =
 		tevent_req_data(req,
 		struct smbXcli_req_state);
 
-	/*
-	 * Make sure we really remove it from
-	 * the pending array on destruction.
-	 */
-	state->smb1.mid = 0;
-	smbXcli_req_unset_pending(req);
-	return 0;
+	switch (req_state) {
+	case TEVENT_REQ_RECEIVED:
+		/*
+		 * Make sure we really remove it from
+		 * the pending array on destruction.
+		 */
+		state->smb1.mid = 0;
+		smbXcli_req_unset_pending(req);
+		return;
+	default:
+		return;
+	}
 }
 
 static bool smb1cli_req_cancel(struct tevent_req *req);
@@ -893,7 +899,7 @@ bool smbXcli_req_set_pending(struct tevent_req *req)
 	}
 	pending[num_pending] = req;
 	conn->pending = pending;
-	talloc_set_destructor(req, smbXcli_req_destructor);
+	tevent_req_set_cleanup_fn(req, smbXcli_req_cleanup);
 	tevent_req_set_cancel_fn(req, smbXcli_req_cancel);
 
 	if (!smbXcli_conn_receive_next(conn)) {
diff --git a/source3/lib/fncall.c b/source3/lib/fncall.c
index fb3d5c9..7f728ba 100644
--- a/source3/lib/fncall.c
+++ b/source3/lib/fncall.c
@@ -122,7 +122,8 @@ static int fncall_next_job_id(struct fncall_context *ctx)
 }
 
 static void fncall_unset_pending(struct tevent_req *req);
-static int fncall_destructor(struct tevent_req *req);
+static void fncall_cleanup(struct tevent_req *req,
+			   enum tevent_req_state req_state);
 
 static bool fncall_set_pending(struct tevent_req *req,
 			       struct fncall_context *ctx,
@@ -141,12 +142,12 @@ static bool fncall_set_pending(struct tevent_req *req,
 	pending[num_pending] = req;
 	num_pending += 1;
 	ctx->pending = pending;
-	talloc_set_destructor(req, fncall_destructor);
+	tevent_req_set_cleanup_fn(req, fncall_cleanup);
 
 	/*
 	 * Make sure that the orphaned array of fncall_state structs has
 	 * enough space. A job can change from pending to orphaned in
-	 * fncall_destructor, and to fail in a talloc destructor should be
+	 * fncall_cleanup, and to fail in a talloc destructor should be
 	 * avoided if possible.
 	 */
 
@@ -184,6 +185,8 @@ static void fncall_unset_pending(struct tevent_req *req)
 	int num_pending = talloc_array_length(ctx->pending);
 	int i;
 
+	tevent_req_set_cleanup_fn(req, NULL);
+
 	if (num_pending == 1) {
 		TALLOC_FREE(ctx->fde);
 		TALLOC_FREE(ctx->pending);
@@ -205,16 +208,24 @@ static void fncall_unset_pending(struct tevent_req *req)
 				      num_pending - 1);
 }
 
-static int fncall_destructor(struct tevent_req *req)
+static void fncall_cleanup(struct tevent_req *req,
+			   enum tevent_req_state req_state)
 {
 	struct fncall_state *state = tevent_req_data(
 		req, struct fncall_state);
 	struct fncall_context *ctx = state->ctx;
 
+	switch (req_state) {
+	case TEVENT_REQ_RECEIVED:
+		break;
+	default:
+		return;
+	}
+
 	fncall_unset_pending(req);
 
 	if (state->done) {
-		return 0;
+		return;
 	}
 
 	/*
@@ -223,8 +234,6 @@ static int fncall_destructor(struct tevent_req *req)
 	 */
 	ctx->orphaned[ctx->num_orphaned] = talloc_move(ctx->orphaned, &state);
 	ctx->num_orphaned += 1;
-
-	return 0;
 }
 
 struct tevent_req *fncall_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
diff --git a/source3/lib/tldap.c b/source3/lib/tldap.c
index b094c2d..b15ee73 100644
--- a/source3/lib/tldap.c
+++ b/source3/lib/tldap.c
@@ -444,6 +444,8 @@ static void tldap_msg_unset_pending(struct tevent_req *req)
 	int num_pending = talloc_array_length(ld->pending);
 	int i;
 
+	tevent_req_set_cleanup_fn(req, NULL);
+
 	if (num_pending == 1) {
 		TALLOC_FREE(ld->pending);
 		return;
@@ -479,10 +481,17 @@ static void tldap_msg_unset_pending(struct tevent_req *req)
 	return;
 }
 
-static int tldap_msg_destructor(struct tevent_req *req)
+static void tldap_msg_cleanup(struct tevent_req *req,
+			      enum tevent_req_state req_state)
 {
-	tldap_msg_unset_pending(req);
-	return 0;
+	switch (req_state) {
+	case TEVENT_REQ_USER_ERROR:
+	case TEVENT_REQ_RECEIVED:
+		tldap_msg_unset_pending(req);
+		return;
+	default:
+		return;
+	}
 }
 
 static bool tldap_msg_set_pending(struct tevent_req *req)
@@ -504,7 +513,7 @@ static bool tldap_msg_set_pending(struct tevent_req *req)
 	}
 	pending[num_pending] = req;
 	ld->pending = pending;
-	talloc_set_destructor(req, tldap_msg_destructor);
+	tevent_req_set_cleanup_fn(req, tldap_msg_cleanup);
 
 	if (num_pending > 0) {
 		return true;
@@ -618,7 +627,6 @@ static void tldap_msg_received(struct tevent_req *subreq)
 	state->inbuf = talloc_move(state, &inbuf);
 	state->data = talloc_move(state, &data);
 
-	talloc_set_destructor(req, NULL);
 	tldap_msg_unset_pending(req);
 	num_pending = talloc_array_length(ld->pending);
 
@@ -650,8 +658,8 @@ static void tldap_msg_received(struct tevent_req *subreq)
  fail:
 	while (talloc_array_length(ld->pending) > 0) {
 		req = ld->pending[0];
-		talloc_set_destructor(req, NULL);
-		tldap_msg_destructor(req);
+		state = tevent_req_data(req, struct tldap_msg_state);
+		tevent_req_defer_callback(req, state->ev);
 		tevent_req_error(req, status);
 	}
 }


-- 
Samba Shared Repository


More information about the samba-cvs mailing list