From: Alan T. DeKok Date: Fri, 15 Jul 2022 15:50:04 +0000 (-0400) Subject: hoist common code to common function X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=78ede05e9d0e6aa5d5a9275f1ec512ebb069545d;p=thirdparty%2Ffreeradius-server.git hoist common code to common function in preparation for doing paircmp() in the new xlat framework --- diff --git a/src/lib/server/cond_eval.c b/src/lib/server/cond_eval.c index b4ac9adb15f..6e68dabe345 100644 --- a/src/lib/server/cond_eval.c +++ b/src/lib/server/cond_eval.c @@ -556,7 +556,7 @@ static bool cond_compare_attrs(request_t *request, fr_value_box_t *lhs, map_t co static bool cond_compare_virtual(request_t *request, map_t const *map) { int rcode; - fr_pair_t *virt, *vp; + fr_pair_t *vp; fr_value_box_t *rhs, rhs_cast; fr_dcursor_t cursor; tmpl_dcursor_ctx_t cc; @@ -577,15 +577,7 @@ static bool cond_compare_virtual(request_t *request, map_t const *map) break; } - /* - * Create the virtual check item. - */ - MEM(virt = fr_pair_afrom_da(request->request_ctx, tmpl_da(map->lhs))); - virt->op = map->op; - fr_value_box_copy(virt, &virt->data, rhs); - - rcode = paircmp_virtual(request, virt); - talloc_free(virt); + rcode = paircmp_virtual(request, tmpl_da(map->lhs), map->op, rhs); rcode = (rcode == 0) ? 1 : 0; if (rhs == &rhs_cast) fr_value_box_clear(&rhs_cast); if (rcode != 0) break; @@ -703,8 +695,6 @@ static bool cond_eval_map(request_t *request, fr_cond_t const *c, * an attribute or a list. */ if (c->pass2_fixup == PASS2_PAIRCOMPARE) { - fr_pair_t *vp; - fr_assert(tmpl_is_attr(map->lhs)); if (map->op == T_OP_REG_EQ) { @@ -731,16 +721,11 @@ static bool cond_eval_map(request_t *request, fr_cond_t const *c, return false; } - MEM(vp = fr_pair_afrom_da(request->request_ctx, tmpl_da(map->lhs))); - vp->op = c->data.map->op; - fr_value_box_copy(vp, &vp->data, rhs); - /* * Do JUST the virtual attribute comparison. * Skip all of the rest of the complexity of paircmp(). */ - rcode = paircmp_virtual(request, vp); - talloc_free(vp); + rcode = paircmp_virtual(request, tmpl_da(map->lhs), c->data.map->op, rhs); rcode = (rcode == 0) ? 1 : 0; goto done; } diff --git a/src/lib/server/paircmp.c b/src/lib/server/paircmp.c index a9171abd271..d0654af5d6c 100644 --- a/src/lib/server/paircmp.c +++ b/src/lib/server/paircmp.c @@ -455,19 +455,32 @@ static int paircmp_func(request_t *request, * comparison function called. * * @param[in] request Current request. - * @param[in] check_item item to compare. + * @param[in] da the da to use + * @param[in] op operator to use + * @param[in] value value-box to use. * @return * - 0 if check_item matches * - -1 if check_item is smaller * - 1 if check_item is larger */ -int paircmp_virtual(request_t *request, fr_pair_t const *check_item) +int paircmp_virtual(request_t *request, fr_dict_attr_t const *da, fr_token_t op, fr_value_box_t const *value) { paircmp_t *c; for (c = cmp; c; c = c->next) { - if (c->da == check_item->da) { - return (c->compare)(c->instance, request, check_item); + if (c->da == da) { + fr_pair_t *vp; + int rcode; + + vp = fr_pair_afrom_da(request->request_ctx, da); + if (!vp) return -1; + + vp->op = op; + fr_value_box_copy(vp, &vp->data, value); + + rcode = (c->compare)(c->instance, request, vp); + talloc_free(vp); + return rcode; } } diff --git a/src/lib/server/paircmp.h b/src/lib/server/paircmp.h index fc85ffa9eeb..7e14e777666 100644 --- a/src/lib/server/paircmp.h +++ b/src/lib/server/paircmp.h @@ -41,7 +41,7 @@ int paircmp_pairs(request_t *request, fr_pair_t const *check, fr_pair_t *vp); int paircmp(request_t *request, fr_pair_list_t *request_list, fr_pair_list_t *check_list); -int paircmp_virtual(request_t *request, fr_pair_t const *check_item); +int paircmp_virtual(request_t *request, fr_dict_attr_t const *da, fr_token_t op, fr_value_box_t const *value); int paircmp_find(fr_dict_attr_t const *da);