summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2013-06-18 13:27:00 +0200
committerJakub Hrozek <jhrozek@redhat.com>2013-08-09 15:37:13 +0200
commit95eba1e434e68ef14e6e39c69687b351e822e4bf (patch)
tree496c3b82fd3f7b57cf5bb5e2f45a5d2f2879aada
parentfe586d2c49a33115434c979ff796e56bd218229b (diff)
downloadsssd-95eba1e434e68ef14e6e39c69687b351e822e4bf.tar.gz
sssd-95eba1e434e68ef14e6e39c69687b351e822e4bf.tar.xz
sssd-95eba1e434e68ef14e6e39c69687b351e822e4bf.zip
collapse_srv_lookup may free the server, make it clear from the API
https://fedorahosted.org/sssd/ticket/1947
-rw-r--r--src/providers/fail_over.c13
1 files changed, 8 insertions, 5 deletions
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 */