From b525aa57f138f67624038c4a1bdeca9042bcf2f0 Mon Sep 17 00:00:00 2001 From: Pavel Březina Date: Tue, 27 Aug 2013 11:11:05 +0200 Subject: SIGCHLD handler: do not call callback when pvt data where freed https://fedorahosted.org/sssd/ticket/1992 --- src/providers/ipa/ipa_dyndns.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/providers/ipa/ipa_dyndns.c') diff --git a/src/providers/ipa/ipa_dyndns.c b/src/providers/ipa/ipa_dyndns.c index 561ee5280..a43901b6c 100644 --- a/src/providers/ipa/ipa_dyndns.c +++ b/src/providers/ipa/ipa_dyndns.c @@ -356,6 +356,7 @@ failed: struct nsupdate_send_ctx { struct ipa_nsupdate_ctx *nsupdate_ctx; + struct sss_child_ctx_old *child_ctx; int child_status; }; @@ -588,7 +589,8 @@ fork_nsupdate_send(struct ipa_nsupdate_ctx *ctx) /* Set up SIGCHLD handler */ ret = child_handler_setup(ctx->dyndns_ctx->ipa_ctx->id_ctx->be->ev, - pid, ipa_dyndns_child_handler, req); + pid, ipa_dyndns_child_handler, req, + &state->child_ctx); if (ret != EOK) { return NULL; } @@ -618,9 +620,16 @@ static void ipa_dyndns_timeout(struct tevent_context *ev, { struct tevent_req *req = talloc_get_type(pvt, struct tevent_req); + struct nsupdate_send_ctx *state = + tevent_req_data(req, struct nsupdate_send_ctx); + DEBUG(1, ("Timeout reached for dynamic DNS update\n")); + child_handler_destroy(state->child_ctx); + state->child_ctx = NULL; + state->child_status = ETIMEDOUT; + tevent_req_error(req, ETIMEDOUT); } -- cgit