diff options
-rw-r--r-- | src/providers/fail_over.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/providers/fail_over.c b/src/providers/fail_over.c index aff3ffd4..02d913b9 100644 --- a/src/providers/fail_over.c +++ b/src/providers/fail_over.c @@ -74,6 +74,8 @@ struct fo_server { struct server_common { REFCOUNT_COMMON; + struct fo_ctx *ctx; + struct server_common *prev; struct server_common *next; @@ -313,6 +315,20 @@ get_server_common(TALLOC_CTX *mem_ctx, struct fo_ctx *ctx, const char *name, return ENOENT; } +static int server_common_destructor(void *memptr) +{ + struct server_common *common; + + common = talloc_get_type(memptr, struct server_common); + if (common->request_list) { + DEBUG(1, ("BUG: pending requests still associated with this server\n")); + return -1; + } + DLIST_REMOVE(common->ctx->server_common_list, common); + + return 0; +} + static struct server_common * create_server_common(TALLOC_CTX *mem_ctx, struct fo_ctx *ctx, const char *name) { @@ -328,6 +344,7 @@ create_server_common(TALLOC_CTX *mem_ctx, struct fo_ctx *ctx, const char *name) return NULL; } + common->ctx = ctx; common->prev = NULL; common->next = NULL; common->hostent = NULL; @@ -336,6 +353,7 @@ create_server_common(TALLOC_CTX *mem_ctx, struct fo_ctx *ctx, const char *name) common->last_status_change.tv_sec = 0; common->last_status_change.tv_usec = 0; + talloc_set_destructor((TALLOC_CTX *) common, server_common_destructor); DLIST_ADD_END(ctx->server_common_list, common, struct server_common *); return common; } @@ -452,7 +470,12 @@ set_lookup_hook(struct fo_server *server, struct tevent_req *req) talloc_free(request); return ENOMEM; } - request->server_common = server->common; + request->server_common = rc_reference(request, struct server_common, + server->common); + if (request->server_common == NULL) { + talloc_free(request); + return ENOMEM; + } request->req = req; DLIST_ADD(server->common->request_list, request); talloc_set_destructor(request, resolve_service_request_destructor); |