diff options
author | Amitay Isaacs <amitay@gmail.com> | 2017-10-19 14:58:18 +1100 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2017-11-21 05:03:16 +0100 |
commit | 848f2425984667c243ccac847b8f48a66ce10178 (patch) | |
tree | b8bb001cca7fad8b1a8ae90795cf284524beecf5 /ctdb/server/ctdb_call.c | |
parent | 757a120fc4c659047bd6a1175b24f0673630ce2d (diff) | |
download | samba-848f2425984667c243ccac847b8f48a66ce10178.tar.gz |
ctdb-daemon: Allocate deferred calls off calling context
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>
Diffstat (limited to 'ctdb/server/ctdb_call.c')
-rw-r--r-- | ctdb/server/ctdb_call.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/ctdb/server/ctdb_call.c b/ctdb/server/ctdb_call.c index 5b2e2f5a02e..17d6f98e37c 100644 --- a/ctdb/server/ctdb_call.c +++ b/ctdb/server/ctdb_call.c @@ -1549,6 +1549,7 @@ struct revokechild_deferred_call { struct ctdb_req_header *hdr; deferred_requeue_fn fn; void *ctx; + struct revokechild_handle *rc; }; struct revokechild_handle { @@ -1573,12 +1574,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) { @@ -1917,7 +1926,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; @@ -1927,6 +1936,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); |