summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2013-06-18 13:27:00 +0200
committerJakub Hrozek <jhrozek@redhat.com>2013-06-21 14:12:55 +0200
commit5ecdadbb6460877ebd6884131de38a5439555c8f (patch)
tree502810b622431fce9b5f8e9e9260376c8c9be3e6 /src
parent5e0f0c4e1f93ed788f98fbc3e4ca1509366f89e0 (diff)
downloadsssd-5ecdadbb6460877ebd6884131de38a5439555c8f.tar.gz
sssd-5ecdadbb6460877ebd6884131de38a5439555c8f.tar.xz
sssd-5ecdadbb6460877ebd6884131de38a5439555c8f.zip
collapse_srv_lookup may free the server, make it clear from the API
https://fedorahosted.org/sssd/ticket/1947
Diffstat (limited to 'src')
-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 */