summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2014-09-02 16:45:35 +0200
committerJakub Hrozek <jhrozek@redhat.com>2014-09-05 16:24:03 +0200
commit7ec88ea204c0d1db40a93502c70c7bc0491ec262 (patch)
tree6479349c5cb72ff68d4add9ebed2645dbb9c08fa
parent3ac7c4fe618ede980a4df8d90341ef1fd0f1f62f (diff)
downloadsssd-7ec88ea204c0d1db40a93502c70c7bc0491ec262.tar.gz
sssd-7ec88ea204c0d1db40a93502c70c7bc0491ec262.tar.xz
sssd-7ec88ea204c0d1db40a93502c70c7bc0491ec262.zip
LDAP: Don't reuse a single tevent callback for multiple requests
Several requests (deref, ASQ and SD) were using the same tevent callback. This worked fine for quite some time, because the callback only used the tevent_req variables. However, a recent patch changed the shared sdap_get_generic_done so that it also longer uses the 'state' variable. At that point, all requsts that re-used the sdap_get_generic_done request started failing becaus the type of the state variable was different. This patch makes sure the callbacks only manipulate their own data types. Moreover, sdap_get_generic_ext_done() was renamed because it's not really a tevent callback. Reviewed-by: Michal Židek <mzidek@redhat.com>
-rw-r--r--src/providers/ldap/sdap_async.c80
1 files changed, 53 insertions, 27 deletions
diff --git a/src/providers/ldap/sdap_async.c b/src/providers/ldap/sdap_async.c
index ed20b26fd..87c125faa 100644
--- a/src/providers/ldap/sdap_async.c
+++ b/src/providers/ldap/sdap_async.c
@@ -1150,9 +1150,9 @@ struct sdap_get_generic_ext_state {
static errno_t sdap_get_generic_ext_step(struct tevent_req *req);
-static void sdap_get_generic_ext_done(struct sdap_op *op,
- struct sdap_msg *reply,
- int error, void *pvt);
+static void sdap_get_generic_op_finished(struct sdap_op *op,
+ struct sdap_msg *reply,
+ int error, void *pvt);
static struct tevent_req *
sdap_get_generic_ext_send(TALLOC_CTX *memctx,
@@ -1351,7 +1351,7 @@ static errno_t sdap_get_generic_ext_step(struct tevent_req *req)
DEBUG(SSSDBG_TRACE_INTERNAL, "ldap_search_ext called, msgid = %d\n", msgid);
ret = sdap_op_add(state, state->ev, state->sh, msgid,
- sdap_get_generic_ext_done, req,
+ sdap_get_generic_op_finished, req,
state->timeout,
&state->op);
if (ret != EOK) {
@@ -1363,9 +1363,9 @@ done:
return ret;
}
-static void sdap_get_generic_ext_done(struct sdap_op *op,
- struct sdap_msg *reply,
- int error, void *pvt)
+static void sdap_get_generic_op_finished(struct sdap_op *op,
+ struct sdap_msg *reply,
+ int error, void *pvt)
{
struct tevent_req *req = talloc_get_type(pvt, struct tevent_req);
struct sdap_get_generic_ext_state *state = tevent_req_data(req,
@@ -1526,6 +1526,31 @@ sdap_get_generic_ext_recv(struct tevent_req *req)
return EOK;
}
+static void generic_ext_search_handler(struct tevent_req *subreq,
+ struct sdap_options *opts)
+{
+ struct tevent_req *req = tevent_req_callback_data(subreq,
+ struct tevent_req);
+ int ret;
+
+ ret = sdap_get_generic_ext_recv(subreq);
+ talloc_zfree(subreq);
+ if (ret == ERR_REFERRAL) {
+ if (dp_opt_get_bool(opts->basic, SDAP_REFERRALS)) {
+ tevent_req_error(req, ret);
+ return;
+ }
+ } else if (ret) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ "sdap_get_generic_ext_recv failed [%d]: %s\n",
+ ret, sss_strerror(ret));
+ tevent_req_error(req, ret);
+ return;
+ }
+
+ tevent_req_done(req);
+}
+
/* ==Generic Search============================================ */
struct sdap_get_generic_state {
struct sdap_attr_map *map;
@@ -1615,24 +1640,8 @@ static void sdap_get_generic_done(struct tevent_req *subreq)
struct tevent_req);
struct sdap_get_generic_state *state =
tevent_req_data(req, struct sdap_get_generic_state);
- int ret;
- ret = sdap_get_generic_ext_recv(subreq);
- talloc_zfree(subreq);
- if (ret == ERR_REFERRAL) {
- if (dp_opt_get_bool(state->opts->basic, SDAP_REFERRALS)) {
- tevent_req_error(req, ret);
- return;
- }
- } else if (ret) {
- DEBUG(SSSDBG_CONF_SETTINGS,
- "sdap_get_generic_ext_recv failed [%d]: %s\n",
- ret, sss_strerror(ret));
- tevent_req_error(req, ret);
- return;
- }
-
- tevent_req_done(req);
+ return generic_ext_search_handler(subreq, state->opts);
}
int sdap_get_generic_recv(struct tevent_req *req,
@@ -1668,6 +1677,7 @@ struct sdap_x_deref_search_state {
struct sdap_op *op;
struct sdap_attr_map_info *maps;
LDAPControl **ctrls;
+ struct sdap_options *opts;
struct sdap_deref_reply dreply;
int num_maps;
@@ -1691,6 +1701,7 @@ sdap_x_deref_search_send(TALLOC_CTX *memctx, struct tevent_context *ev,
state->sh = sh;
state->maps = maps;
state->op = NULL;
+ state->opts = opts;
state->num_maps = num_maps;
state->ctrls = talloc_zero_array(state, LDAPControl *, 2);
if (state->ctrls == NULL) {
@@ -1840,7 +1851,12 @@ done:
static void sdap_x_deref_search_done(struct tevent_req *subreq)
{
- sdap_get_generic_done(subreq);
+ struct tevent_req *req = tevent_req_callback_data(subreq,
+ struct tevent_req);
+ struct sdap_x_deref_search_state *state =
+ tevent_req_data(req, struct sdap_x_deref_search_state);
+
+ return generic_ext_search_handler(subreq, state->opts);
}
static int sdap_x_deref_search_ctrls_destructor(void *ptr)
@@ -2009,7 +2025,12 @@ static errno_t sdap_sd_search_parse_entry(struct sdap_handle *sh,
static void sdap_sd_search_done(struct tevent_req *subreq)
{
- sdap_get_generic_done(subreq);
+ struct tevent_req *req = tevent_req_callback_data(subreq,
+ struct tevent_req);
+ struct sdap_sd_search_state *state =
+ tevent_req_data(req, struct sdap_sd_search_state);
+
+ return generic_ext_search_handler(subreq, state->opts);
}
static int sdap_sd_search_ctrls_destructor(void *ptr)
@@ -2253,7 +2274,12 @@ done:
static void sdap_asq_search_done(struct tevent_req *subreq)
{
- sdap_get_generic_done(subreq);
+ struct tevent_req *req = tevent_req_callback_data(subreq,
+ struct tevent_req);
+ struct sdap_asq_search_state *state =
+ tevent_req_data(req, struct sdap_asq_search_state);
+
+ return generic_ext_search_handler(subreq, state->opts);
}
static int sdap_asq_search_ctrls_destructor(void *ptr)