]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
hoist common code to common function
authorAlan T. DeKok <aland@freeradius.org>
Fri, 15 Jul 2022 15:50:04 +0000 (11:50 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 17 Jul 2022 18:08:38 +0000 (14:08 -0400)
in preparation for doing paircmp() in the new xlat framework

src/lib/server/cond_eval.c
src/lib/server/paircmp.c
src/lib/server/paircmp.h

index b4ac9adb15f3f574b208b47e837f9b1a158f47fc..6e68dabe34572ecc55c1186d60802bca2549a473 100644 (file)
@@ -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;
        }
index a9171abd2716c8f77464abd54c273532b232ba6f..d0654af5d6c367585481f01a943ddf12f2264590 100644 (file)
@@ -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;
                }
        }
 
index fc85ffa9eeb36facfe5a27dc506dd6d1270d842b..7e14e77766683423da2f6e2c56ce66a6b52b8433 100644 (file)
@@ -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);