From 5984e8ef15ff0888a11383fc655f8a700bc3e6fe Mon Sep 17 00:00:00 2001 From: Simo Sorce <ssorce@redhat.com> Date: Mon, 26 Oct 2009 18:48:55 -0400 Subject: Kill the ldap connection when we go offline This patch uses a wrapper to kill the ldap connection when we are marked offline. This also makes sure we do not try to reuse a bad connection handler after a fatal error. --- server/providers/ldap/ldap_id.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'server') diff --git a/server/providers/ldap/ldap_id.c b/server/providers/ldap/ldap_id.c index ecb87617..9fd0d4f1 100644 --- a/server/providers/ldap/ldap_id.c +++ b/server/providers/ldap/ldap_id.c @@ -73,6 +73,17 @@ static bool connected(struct sdap_id_ctx *ctx) return false; } +static void mark_offline(struct sdap_id_ctx *ctx) +{ + if (ctx->gsh) { + /* make sure we mark the connection as gone when we go offline so that + * we do not try to reuse a bad connection by mistale later */ + talloc_zfree(ctx->gsh); + } + + be_mark_offline(ctx->be); +} + /* =Users-Related-Functions-(by-name,by-uid)============================== */ struct users_get_state { @@ -233,7 +244,7 @@ static void users_get_done(struct tevent_req *req) if (ret == ETIMEDOUT || ret == EFAULT) { ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data, struct sdap_id_ctx); - be_mark_offline(ctx->be); + mark_offline(ctx); } } @@ -400,7 +411,7 @@ static void groups_get_done(struct tevent_req *req) if (ret == ETIMEDOUT || ret == EFAULT) { ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data, struct sdap_id_ctx); - be_mark_offline(ctx->be); + mark_offline(ctx); } } @@ -542,7 +553,7 @@ static void groups_by_user_done(struct tevent_req *req) if (ret == ETIMEDOUT || ret == EFAULT) { ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data, struct sdap_id_ctx); - be_mark_offline(ctx->be); + mark_offline(ctx); } } @@ -809,7 +820,7 @@ fail: DEBUG(9, ("User enumeration failed with: (%d)[%s]\n", (int)err, strerror(err))); - be_mark_offline(state->ctx->be); + mark_offline(state->ctx); } DEBUG(1, ("Failed to enumerate users, retrying later!\n")); @@ -835,7 +846,7 @@ static void ldap_id_enum_groups_done(struct tevent_req *subreq) fail: /* always go offline on failures */ - be_mark_offline(state->ctx->be); + mark_offline(state->ctx); DEBUG(1, ("Failed to enumerate groups (%d [%s]), retrying later!\n", (int)err, strerror(err))); tevent_req_done(req); -- cgit