From 95eba1e434e68ef14e6e39c69687b351e822e4bf Mon Sep 17 00:00:00 2001 From: Pavel Březina Date: Tue, 18 Jun 2013 13:27:00 +0200 Subject: collapse_srv_lookup may free the server, make it clear from the API https://fedorahosted.org/sssd/ticket/1947 --- src/providers/fail_over.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/providers/fail_over.c b/src/providers/fail_over.c index ee63479f8..47bbd820d 100644 --- a/src/providers/fail_over.c +++ b/src/providers/fail_over.c @@ -227,10 +227,11 @@ get_srv_query(TALLOC_CTX *mem_ctx, struct fo_server *server) } static struct fo_server * -collapse_srv_lookup(struct fo_server *server) +collapse_srv_lookup(struct fo_server **_server) { - struct fo_server *tmp, *meta; + struct fo_server *tmp, *meta, *server; + server = *_server; meta = server->srv_data->meta; DEBUG(4, ("Need to refresh SRV lookup for domain %s\n", meta->srv_data->dns_domain)); @@ -263,6 +264,8 @@ collapse_srv_lookup(struct fo_server *server) meta->srv_data->srv_lookup_status = SRV_NEUTRAL; meta->srv_data->last_status_change.tv_sec = 0; + *_server = NULL; + return meta; } @@ -1102,7 +1105,7 @@ resolve_srv_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, str_srv_data_status(status))); switch(status) { case SRV_EXPIRED: /* Need a refresh */ - state->meta = collapse_srv_lookup(server); + state->meta = collapse_srv_lookup(&server); /* FALLTHROUGH. * "server" might be invalid now if the SRV * query collapsed @@ -1113,7 +1116,7 @@ resolve_srv_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, DEBUG(SSSDBG_TRACE_FUNC, ("SRV resolution of service '%s'. " "dns_discovery_domain not specified. Need to look it up.\n", - server->service->name)); + state->meta->service->name)); subreq = resolve_get_domain_send(state, ev, ctx, resolv); if (subreq == NULL) { ret = ENOMEM; @@ -1126,7 +1129,7 @@ resolve_srv_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, DEBUG(SSSDBG_TRACE_FUNC, ("SRV resolution of service '%s'. " "Will use DNS discovery domain '%s'\n", - server->service->name, state->meta->srv_data->dns_domain)); + state->meta->service->name, state->meta->srv_data->dns_domain)); resolve_srv_cont(req); break; case SRV_RESOLVE_ERROR: /* query could not be resolved but don't retry yet */ -- cgit