]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
ctdb-daemon: Allocate deferred calls off calling context
authorAmitay Isaacs <amitay@gmail.com>
Thu, 19 Oct 2017 03:58:18 +0000 (14:58 +1100)
committerKarolin Seeger <kseeger@samba.org>
Wed, 22 Nov 2017 08:48:18 +0000 (09:48 +0100)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=13152

This makes sure that if a client disconnects, all the deferred calls
from the client are correctly freed.

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
(cherry picked from commit 848f2425984667c243ccac847b8f48a66ce10178)

ctdb/server/ctdb_call.c

index b3bc9cf747641ed6ad180b185f603acbe4a4f801..a4f84a34a866e5e525a4d9815a9e3881fb65b695 100644 (file)
@@ -1567,6 +1567,7 @@ struct revokechild_deferred_call {
        struct ctdb_req_header *hdr;
        deferred_requeue_fn fn;
        void *ctx;
+       struct revokechild_handle *rc;
 };
 
 struct revokechild_handle {
@@ -1591,12 +1592,20 @@ static void deferred_call_requeue(struct tevent_context *ev,
        while (dlist != NULL) {
                struct revokechild_deferred_call *dcall = dlist;
 
+               talloc_set_destructor(dcall, NULL);
                DLIST_REMOVE(dlist, dcall);
                dcall->fn(dcall->ctx, dcall->hdr);
                talloc_free(dcall);
        }
 }
 
+static int deferred_call_destructor(struct revokechild_deferred_call *dcall)
+{
+       struct revokechild_handle *rc = dcall->rc;
+
+       DLIST_REMOVE(rc->deferred_call_list, dcall);
+       return 0;
+}
 
 static int revokechild_destructor(struct revokechild_handle *rc)
 {
@@ -1935,7 +1944,7 @@ int ctdb_add_revoke_deferred_call(struct ctdb_context *ctdb, struct ctdb_db_cont
                return -1;
        }
 
-       deferred_call = talloc(ctdb_db, struct revokechild_deferred_call);
+       deferred_call = talloc(call_context, struct revokechild_deferred_call);
        if (deferred_call == NULL) {
                DEBUG(DEBUG_ERR,("Failed to allocate deferred call structure for revoking record\n"));
                return -1;
@@ -1945,6 +1954,9 @@ int ctdb_add_revoke_deferred_call(struct ctdb_context *ctdb, struct ctdb_db_cont
        deferred_call->hdr  = talloc_steal(deferred_call, hdr);
        deferred_call->fn   = fn;
        deferred_call->ctx  = call_context;
+       deferred_call->rc   = rc;
+
+       talloc_set_destructor(deferred_call, deferred_call_destructor);
 
        DLIST_ADD(rc->deferred_call_list, deferred_call);