On 05/06/2010 06:33 PM, Dmitri Pal wrote:
And then you do not need enum that looks a bit ugly here... At least this gives the idea of what I mean...
I think I was overtired yesterday. The attached patch should be more sane. -- Stephen Gallagher RHCE 804006346421761 Delivering value year after year. Red Hat ranks #1 in value among software vendors. http://www.redhat.com/promo/vendor/
From cb1a25474db3f02609bab965a320995babe385a8 Mon Sep 17 00:00:00 2001 From: Stephen Gallagher <sgall...@redhat.com> Date: Thu, 6 May 2010 11:23:23 -0400 Subject: [PATCH] Fix segfault in GSSAPI reconnect code Also clean up some duplicated code into a single common routine sdap_account_info_common_done() --- src/providers/ldap/ldap_id.c | 110 +++++++++++++++++------------------------- 1 files changed, 45 insertions(+), 65 deletions(-) diff --git a/src/providers/ldap/ldap_id.c b/src/providers/ldap/ldap_id.c index c472d8b6439514b027b4627f397777933c79db01..627416be0708014b4c24a451accbdd7e721fd0d8 100644 --- a/src/providers/ldap/ldap_id.c +++ b/src/providers/ldap/ldap_id.c @@ -724,96 +724,76 @@ static int sdap_account_info_restart(struct be_req *breq) return EOK; } +static void sdap_account_info_common_done(int ret, struct be_req *breq, + const char *str_on_err) +{ + struct sdap_id_ctx *ctx; + int dp_err = DP_ERR_OK; + const char *errstr = NULL; + errno_t err; + + if (ret != EOK) { + dp_err = DP_ERR_FATAL; + errstr = str_on_err; + + if (ret == ETIMEDOUT || ret == EFAULT || ret == EIO) { + ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data, + struct sdap_id_ctx); + if (sdap_check_gssapi_reconnect(ctx)) { + if (ctx->gsh) { + /* Mark the connection as false so we don't try to use an + * invalid connection by mistake later. + * If the global sdap handler is NULL, it's ok not to do + * anything here. It's always checked by sdap_connected() + * before being used. + */ + ctx->gsh->connected = false; + } + err = sdap_account_info_restart(breq); + if (err == EOK) return; + } + + /* Couldn't reconnect, that was our last try + * Go offline now + */ + dp_err = DP_ERR_OFFLINE; + sdap_mark_offline(ctx); + } + } + + sdap_handler_done(breq, dp_err, ret, errstr); +} + static void sdap_account_info_users_done(struct tevent_req *req) { struct be_req *breq = tevent_req_callback_data(req, struct be_req); - struct sdap_id_ctx *ctx; - int dp_err = DP_ERR_OK; - const char *error = NULL; - int ret, err; + int ret; ret = users_get_recv(req); talloc_zfree(req); - if (ret) { - dp_err = DP_ERR_FATAL; - error = "Enum Users Failed"; - - if (ret == ETIMEDOUT || ret == EFAULT || ret == EIO) { - dp_err = DP_ERR_OFFLINE; - ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data, - struct sdap_id_ctx); - if (sdap_check_gssapi_reconnect(ctx)) { - ctx->gsh->connected = false; - err = sdap_account_info_restart(breq); - if (err == EOK) return; - } - sdap_mark_offline(ctx); - } - } - - sdap_handler_done(breq, dp_err, ret, error); + sdap_account_info_common_done(ret, breq, "Lookup users failed"); } static void sdap_account_info_groups_done(struct tevent_req *req) { struct be_req *breq = tevent_req_callback_data(req, struct be_req); - struct sdap_id_ctx *ctx; - int dp_err = DP_ERR_OK; - const char *error = NULL; - int ret, err; + int ret; ret = groups_get_recv(req); talloc_zfree(req); - if (ret) { - dp_err = DP_ERR_FATAL; - error = "Enum Groups Failed"; - - if (ret == ETIMEDOUT || ret == EFAULT || ret == EIO) { - dp_err = DP_ERR_OFFLINE; - ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data, - struct sdap_id_ctx); - if (sdap_check_gssapi_reconnect(ctx)) { - ctx->gsh->connected = false; - err = sdap_account_info_restart(breq); - if (err == EOK) return; - } - sdap_mark_offline(ctx); - } - } - - return sdap_handler_done(breq, dp_err, ret, error); + sdap_account_info_common_done(ret, breq, "Lookup groups failed"); } static void sdap_account_info_initgr_done(struct tevent_req *req) { struct be_req *breq = tevent_req_callback_data(req, struct be_req); - struct sdap_id_ctx *ctx; - int dp_err = DP_ERR_OK; - const char *error = NULL; int ret; ret = groups_by_user_recv(req); talloc_zfree(req); - if (ret) { - dp_err = DP_ERR_FATAL; - error = "Init Groups Failed"; - - if (ret == ETIMEDOUT || ret == EFAULT || ret == EIO) { - dp_err = DP_ERR_OFFLINE; - ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data, - struct sdap_id_ctx); - if (sdap_check_gssapi_reconnect(ctx)) { - ctx->gsh->connected = false; - sdap_account_info_restart(breq); - return; - } - sdap_mark_offline(ctx); - } - } - - return sdap_handler_done(breq, dp_err, ret, error); + sdap_account_info_common_done(ret, breq, "Init Groups Failed"); } -- 1.7.0.1
_______________________________________________ sssd-devel mailing list sssd-devel@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/sssd-devel