From 7ec88ea204c0d1db40a93502c70c7bc0491ec262 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Tue, 2 Sep 2014 16:45:35 +0200 Subject: LDAP: Don't reuse a single tevent callback for multiple requests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/providers/ldap/sdap_async.c | 80 +++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/providers/ldap/sdap_async.c b/src/providers/ldap/sdap_async.c index ed20b26f..87c125fa 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) -- cgit