On 05/07/2010 10:24 AM, Dmitri Pal wrote:
Stephen Gallagher wrote:
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.
This seems much better, so "visual" ack - I did not try to apply it.
Something is not working for my git repo...
git-remote update hanged... investigating
One comment:
Shouldn't it be "User lookup failed" instead of "Lookup users failed"
and "Group lookup failed" instead of "Lookup groups failed".
Sure, why not. What's one more revision? :)
--
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 587fe79ef3b4907e6b892e231bd392ef43306658 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..f0e96677868811c7ee7a6d1a20339dcf61a3d85f 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, "User lookup 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, "Group lookup 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