summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2015-11-09 12:52:35 +0100
committerLukas Slebodnik <lslebodn@redhat.com>2015-12-15 16:26:48 +0100
commit7e0158f9fdb1d299ab2d018e9d81cc71eed98c15 (patch)
treec88140b2a0065425964a919ac85e7640012c1ffe
parentfc19031212369d69a9693ac8777ce1e61a16fe93 (diff)
downloadsssd-7e0158f9fdb1d299ab2d018e9d81cc71eed98c15.tar.gz
sssd-7e0158f9fdb1d299ab2d018e9d81cc71eed98c15.tar.xz
sssd-7e0158f9fdb1d299ab2d018e9d81cc71eed98c15.zip
SUDO: fix sdap_id_op logic
Adds missing sdap_id_op_done call and retry logic. Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
-rw-r--r--src/providers/ldap/sdap_async_sudo.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/src/providers/ldap/sdap_async_sudo.c b/src/providers/ldap/sdap_async_sudo.c
index fad936c39..5ee0d6f58 100644
--- a/src/providers/ldap/sdap_async_sudo.c
+++ b/src/providers/ldap/sdap_async_sudo.c
@@ -38,7 +38,6 @@ struct sdap_sudo_refresh_state {
struct be_ctx *be_ctx;
struct sdap_options *opts;
struct sdap_id_op *sdap_op;
- struct sdap_id_conn_cache *sdap_conn_cache;
struct sysdb_ctx *sysdb;
struct sss_domain_info *domain;
@@ -124,8 +123,7 @@ struct tevent_req *sdap_sudo_refresh_send(TALLOC_CTX *mem_ctx,
state->be_ctx = be_ctx;
state->opts = opts;
- state->sdap_op = NULL;
- state->sdap_conn_cache = conn_cache;
+ state->sdap_op = sdap_id_op_create(state, conn_cache);
state->sysdb = be_ctx->domain->sysdb;
state->domain = be_ctx->domain;
state->ldap_filter = talloc_strdup(state, ldap_filter);
@@ -133,6 +131,12 @@ struct tevent_req *sdap_sudo_refresh_send(TALLOC_CTX *mem_ctx,
state->dp_error = DP_ERR_FATAL;
state->highest_usn = NULL;
+ if (!state->sdap_op) {
+ DEBUG(SSSDBG_OP_FAILURE, "sdap_id_op_create() failed\n");
+ ret = ENOMEM;
+ goto immediately;
+ }
+
if (state->ldap_filter == NULL) {
ret = ENOMEM;
goto immediately;
@@ -193,15 +197,6 @@ static int sdap_sudo_refresh_retry(struct tevent_req *req)
state = tevent_req_data(req, struct sdap_sudo_refresh_state);
- if (state->sdap_op == NULL) {
- state->sdap_op = sdap_id_op_create(state, state->sdap_conn_cache);
- if (state->sdap_op == NULL) {
- DEBUG(SSSDBG_CRIT_FAILURE, "sdap_id_op_create() failed\n");
- state->dp_error = DP_ERR_FATAL;
- return ENOMEM;
- }
- }
-
subreq = sdap_id_op_connect_send(state->sdap_op, state, &ret);
if (subreq == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "sdap_id_op_connect_send() failed: "
@@ -439,6 +434,7 @@ static void sdap_sudo_refresh_load_done(struct tevent_req *subreq)
struct sdap_sudo_refresh_state *state;
struct sysdb_attrs **rules = NULL;
size_t rules_count = 0;
+ int dp_error;
int ret;
errno_t sret;
bool in_transaction = false;
@@ -449,8 +445,15 @@ static void sdap_sudo_refresh_load_done(struct tevent_req *subreq)
ret = sdap_sudo_load_sudoers_recv(subreq, state, &rules_count, &rules);
talloc_zfree(subreq);
- if (ret != EOK) {
- goto done;
+
+ ret = sdap_id_op_done(state->sdap_op, ret, &dp_error);
+ if (dp_error == DP_ERR_OK && ret != EOK) {
+ /* retry */
+ ret = sdap_sudo_refresh_retry(req);
+ if (ret != EOK) {
+ tevent_req_error(req, ret);
+ }
+ return;
}
DEBUG(SSSDBG_TRACE_FUNC, "Received %zu rules\n", rules_count);
@@ -501,11 +504,10 @@ done:
}
}
+ state->dp_error = dp_error;
if (ret == EOK) {
- state->dp_error = DP_ERR_OK;
tevent_req_done(req);
} else {
- state->dp_error = DP_ERR_FATAL;
tevent_req_error(req, ret);
}
}