>From 5e5ad35b6b68b7c4876196de5d34e5c70ea83c82 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Tue, 2 Sep 2014 16:45:35 +0200 Subject: [PATCH] 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. --- src/providers/ldap/sdap_async.c | 80 +++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 27 deletions(-) diff --git a/src/providers/ldap/sdap_async.c b/src/providers/ldap/sdap_async.c index 3231d92809e24abc2507974cbcab75155e5d2f9f..a8ea53113fe67eed6f50d32f3dd520968b63b76e 100644 --- a/src/providers/ldap/sdap_async.c +++ b/src/providers/ldap/sdap_async.c @@ -1156,9 +1156,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, @@ -1357,7 +1357,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) { @@ -1369,9 +1369,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, @@ -1532,6 +1532,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; @@ -1621,24 +1646,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, @@ -1674,6 +1683,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; @@ -1697,6 +1707,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) { @@ -1846,7 +1857,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) @@ -2015,7 +2031,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) @@ -2259,7 +2280,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) -- 1.9.3