From: Nick Porter Date: Tue, 5 Sep 2023 11:22:09 +0000 (+0100) Subject: Correct passing of fr_ldap_connection_t in async functions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bd07f3ce1b2bc65d25e3f2ddde85e5d57f90c851;p=thirdparty%2Ffreeradius-server.git Correct passing of fr_ldap_connection_t in async functions The comment about changing the connection due to auto re-connect is wrong - that was the old sync code behaviour. --- diff --git a/src/lib/ldap/base.c b/src/lib/ldap/base.c index 28dd59dffb9..1cb1141fe49 100644 --- a/src/lib/ldap/base.c +++ b/src/lib/ldap/base.c @@ -516,7 +516,7 @@ fr_ldap_rcode_t fr_ldap_result(LDAPMessage **result, LDAPControl ***ctrls, * * @param[out] msgid to match response to request. * @param[in] request Current request. - * @param[in,out] pconn to use. May change as this function calls functions which auto re-connect. + * @param[in] pconn to use. * @param[in] dn to use as base for the search. * @param[in] scope to use (LDAP_SCOPE_BASE, LDAP_SCOPE_ONE, LDAP_SCOPE_SUB). * @param[in] filter to use, should be pre-escaped. @@ -526,11 +526,11 @@ fr_ldap_rcode_t fr_ldap_result(LDAPMessage **result, LDAPControl ***ctrls, * @return One of the LDAP_PROC_* (#fr_ldap_rcode_t) values. */ fr_ldap_rcode_t fr_ldap_search_async(int *msgid, request_t *request, - fr_ldap_connection_t **pconn, + fr_ldap_connection_t *pconn, char const *dn, int scope, char const *filter, char const * const *attrs, LDAPControl **serverctrls, LDAPControl **clientctrls) { - fr_ldap_config_t const *handle_config = (*pconn)->config; + fr_ldap_config_t const *handle_config = pconn->config; struct timeval tv; // Holds timeout values. @@ -542,12 +542,12 @@ fr_ldap_rcode_t fr_ldap_search_async(int *msgid, request_t *request, fr_ldap_control_merge(our_serverctrls, our_clientctrls, NUM_ELEMENTS(our_serverctrls), NUM_ELEMENTS(our_clientctrls), - *pconn, serverctrls, clientctrls); + pconn, serverctrls, clientctrls); - fr_assert(*pconn && (*pconn)->handle); + fr_assert(pconn && pconn->handle); if (DEBUG_ENABLED4 || (request && RDEBUG_ENABLED4)) { - fr_ldap_timeout_debug(request, *pconn, fr_time_delta_wrap(0), __FUNCTION__); + fr_ldap_timeout_debug(request, pconn, fr_time_delta_wrap(0), __FUNCTION__); } /* @@ -570,9 +570,9 @@ fr_ldap_rcode_t fr_ldap_search_async(int *msgid, request_t *request, */ memset(&tv, 0, sizeof(tv)); - if (ldap_search_ext((*pconn)->handle, dn, scope, filter, search_attrs, + if (ldap_search_ext(pconn->handle, dn, scope, filter, search_attrs, 0, our_serverctrls, our_clientctrls, NULL, 0, msgid) != LDAP_SUCCESS) { - fr_ldap_rcode_t ret = fr_ldap_error_check(NULL, *pconn, NULL, NULL); + fr_ldap_rcode_t ret = fr_ldap_error_check(NULL, pconn, NULL, NULL); ROPTIONAL(RPERROR, PERROR, "Failed performing search"); return ret; } @@ -751,14 +751,14 @@ unlang_action_t fr_ldap_trunk_modify(rlm_rcode_t *p_result, * * @param[out] msgid LDAP message ID. * @param[in] request Current request. - * @param[in,out] pconn to use. May change as this function calls functions which auto re-connect. + * @param[in] pconn to use. * @param[in] dn of the object to modify. * @param[in] mods to make, see 'man ldap_modify' for more information. * @param[in] serverctrls Search controls to pass to the server. May be NULL. * @param[in] clientctrls Search controls for ldap_modify. May be NULL. * @return One of the LDAP_PROC_* (#fr_ldap_rcode_t) values. */ -fr_ldap_rcode_t fr_ldap_modify_async(int *msgid, request_t *request, fr_ldap_connection_t **pconn, +fr_ldap_rcode_t fr_ldap_modify_async(int *msgid, request_t *request, fr_ldap_connection_t *pconn, char const *dn, LDAPMod *mods[], LDAPControl **serverctrls, LDAPControl **clientctrls) { @@ -768,15 +768,15 @@ fr_ldap_rcode_t fr_ldap_modify_async(int *msgid, request_t *request, fr_ldap_con fr_ldap_control_merge(our_serverctrls, our_clientctrls, NUM_ELEMENTS(our_serverctrls), NUM_ELEMENTS(our_clientctrls), - *pconn, serverctrls, clientctrls); + pconn, serverctrls, clientctrls); - fr_assert(*pconn && (*pconn)->handle); + fr_assert(pconn && pconn->handle); - if (RDEBUG_ENABLED4) fr_ldap_timeout_debug(request, *pconn, fr_time_delta_wrap(0), __FUNCTION__); + if (RDEBUG_ENABLED4) fr_ldap_timeout_debug(request, pconn, fr_time_delta_wrap(0), __FUNCTION__); RDEBUG2("Modifying object with DN \"%s\"", dn); - if(ldap_modify_ext((*pconn)->handle, dn, mods, our_serverctrls, our_clientctrls, msgid) != LDAP_SUCCESS) { - fr_ldap_rcode_t ret = fr_ldap_error_check(NULL, *pconn, NULL, NULL); + if(ldap_modify_ext(pconn->handle, dn, mods, our_serverctrls, our_clientctrls, msgid) != LDAP_SUCCESS) { + fr_ldap_rcode_t ret = fr_ldap_error_check(NULL, pconn, NULL, NULL); ROPTIONAL(RPEDEBUG, RPERROR, "Failed modifying object"); return ret; @@ -845,14 +845,14 @@ unlang_action_t fr_ldap_trunk_extended(rlm_rcode_t *p_result, * @param[in] reqdata Data required for the request. * @return One of the LDAP_PROC_* (#fr_ldap_rcode_t) values. */ -fr_ldap_rcode_t fr_ldap_extended_async(int *msgid, request_t *request, fr_ldap_connection_t **pconn, +fr_ldap_rcode_t fr_ldap_extended_async(int *msgid, request_t *request, fr_ldap_connection_t *pconn, char const *reqoid, struct berval *reqdata) { - fr_assert(*pconn && (*pconn)->handle); + fr_assert(pconn && pconn->handle); RDEBUG2("Requesting extended operation with OID %s", reqoid); - if (ldap_extended_operation((*pconn)->handle, reqoid, reqdata, NULL, NULL, msgid)) { - fr_ldap_rcode_t ret = fr_ldap_error_check(NULL, *pconn, NULL, NULL); + if (ldap_extended_operation(pconn->handle, reqoid, reqdata, NULL, NULL, msgid)) { + fr_ldap_rcode_t ret = fr_ldap_error_check(NULL, pconn, NULL, NULL); RPERROR("Failed requesting extended operation"); return ret; } diff --git a/src/lib/ldap/base.h b/src/lib/ldap/base.h index 477ecd0dbe6..fddacbc1d50 100644 --- a/src/lib/ldap/base.h +++ b/src/lib/ldap/base.h @@ -766,15 +766,15 @@ ssize_t fr_ldap_xlat_filter(request_t *request, char const **sub, size_t sublen char const *fr_ldap_error_str(fr_ldap_connection_t const *conn); fr_ldap_rcode_t fr_ldap_search_async(int *msgid, request_t *request, - fr_ldap_connection_t **pconn, + fr_ldap_connection_t *pconn, char const *dn, int scope, char const *filter, char const * const *attrs, LDAPControl **serverctrls, LDAPControl **clientctrls); -fr_ldap_rcode_t fr_ldap_modify_async(int *msgid, request_t *request, fr_ldap_connection_t **pconn, +fr_ldap_rcode_t fr_ldap_modify_async(int *msgid, request_t *request, fr_ldap_connection_t *pconn, char const *dn, LDAPMod *mods[], LDAPControl **serverctrls, LDAPControl **clientctrls); -fr_ldap_rcode_t fr_ldap_extended_async(int *msgid, request_t *request, fr_ldap_connection_t **pconn, +fr_ldap_rcode_t fr_ldap_extended_async(int *msgid, request_t *request, fr_ldap_connection_t *pconn, char const *reqiod, struct berval *reqdata); fr_ldap_rcode_t fr_ldap_error_check(LDAPControl ***ctrls, fr_ldap_connection_t const *conn, diff --git a/src/lib/ldap/connection.c b/src/lib/ldap/connection.c index 1b86dc33755..36a16089985 100644 --- a/src/lib/ldap/connection.c +++ b/src/lib/ldap/connection.c @@ -685,7 +685,7 @@ static void ldap_trunk_request_mux(UNUSED fr_event_list_t *el, fr_trunk_connecti * If we are chasing a referral, referral_url will be populated and may * have a base dn or scope to override the original query */ - status = fr_ldap_search_async(&query->msgid, query->treq->request, &ldap_conn, + status = fr_ldap_search_async(&query->msgid, query->treq->request, ldap_conn, (referral_url && referral_url->lud_dn) ? referral_url->lud_dn : query->dn, (referral_url && referral_url->lud_scope) ? @@ -702,7 +702,7 @@ static void ldap_trunk_request_mux(UNUSED fr_event_list_t *el, fr_trunk_connecti POPULATE_LDAP_CONTROLS(our_clientctrls, query->clientctrls); status = fr_ldap_modify_async(&query->msgid, query->treq->request, - &ldap_conn, query->dn, query->mods, + ldap_conn, query->dn, query->mods, our_serverctrls, our_clientctrls); break; @@ -710,7 +710,7 @@ static void ldap_trunk_request_mux(UNUSED fr_event_list_t *el, fr_trunk_connecti /* * This query is an LDAP extended operation. */ - status = fr_ldap_extended_async(&query->msgid, query->treq->request, &ldap_conn, + status = fr_ldap_extended_async(&query->msgid, query->treq->request, ldap_conn, query->extended.reqoid, query->extended.reqdata); break; diff --git a/src/lib/ldap/directory.c b/src/lib/ldap/directory.c index da8c61b27fe..9af4bde1933 100644 --- a/src/lib/ldap/directory.c +++ b/src/lib/ldap/directory.c @@ -288,7 +288,7 @@ int fr_ldap_conn_directory_alloc_async(fr_ldap_connection_t *ldap_conn) ldap_conn->directory = talloc_zero(ldap_conn, fr_ldap_directory_t); if (!ldap_conn->directory) return -1; - if (fr_ldap_search_async(&msgid, NULL, &ldap_conn, "", LDAP_SCOPE_BASE, "(objectclass=*)", attrs, + if (fr_ldap_search_async(&msgid, NULL, ldap_conn, "", LDAP_SCOPE_BASE, "(objectclass=*)", attrs, NULL, NULL) != LDAP_PROC_SUCCESS) return -1; return msgid; diff --git a/src/listen/ldap_sync/active_directory.c b/src/listen/ldap_sync/active_directory.c index f5cad5f95b7..56b1537922e 100644 --- a/src/listen/ldap_sync/active_directory.c +++ b/src/listen/ldap_sync/active_directory.c @@ -129,7 +129,7 @@ int active_directory_sync_state_init(fr_ldap_connection_t *conn, size_t sync_no, */ ldap_sync_conf_attr_add(UNCONST(sync_config_t *, config), "isDeleted"); - rcode = fr_ldap_search_async(&sync->msgid, NULL, &conn, config->base_dn, config->scope, + rcode = fr_ldap_search_async(&sync->msgid, NULL, conn, config->base_dn, config->scope, filter ? filter : config->filter, config->attrs, ctrls, NULL); if (rcode != LDAP_PROC_SUCCESS) goto error; diff --git a/src/listen/ldap_sync/persistent_search.c b/src/listen/ldap_sync/persistent_search.c index fcfd018871f..314b29c1238 100644 --- a/src/listen/ldap_sync/persistent_search.c +++ b/src/listen/ldap_sync/persistent_search.c @@ -113,7 +113,7 @@ int persistent_sync_state_init(fr_ldap_connection_t *conn, size_t sync_no, proto */ ctrl.ldctl_iscritical = 1; - ret = fr_ldap_search_async(&sync->msgid, NULL, &conn, config->base_dn, config->scope, + ret = fr_ldap_search_async(&sync->msgid, NULL, conn, config->base_dn, config->scope, config->filter, config->attrs, ctrls, NULL); ber_free(ber, 1); diff --git a/src/listen/ldap_sync/rfc4533.c b/src/listen/ldap_sync/rfc4533.c index 6b712263594..bac987ddf56 100644 --- a/src/listen/ldap_sync/rfc4533.c +++ b/src/listen/ldap_sync/rfc4533.c @@ -129,7 +129,7 @@ int rfc4533_sync_init(fr_ldap_connection_t *conn, size_t sync_no, proto_ldap_syn memcpy(&ctrls[0]->ldctl_oid, &sync_ctl_oid, sizeof(ctrls[0]->ldctl_oid)); ctrl.ldctl_iscritical = 1; - ret = fr_ldap_search_async(&sync->msgid, NULL, &conn, config->base_dn, config->scope, + ret = fr_ldap_search_async(&sync->msgid, NULL, conn, config->base_dn, config->scope, config->filter, config->attrs, ctrls, NULL); ber_free(ber, 1);