]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
if we're setting a leaf num, ensure the filter type is correct
authorAlan T. DeKok <aland@freeradius.org>
Sat, 31 Aug 2024 14:02:46 +0000 (10:02 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Sat, 31 Aug 2024 14:02:46 +0000 (10:02 -0400)
src/lib/server/tmpl.h
src/lib/server/tmpl_tokenize.c

index 7c4dc72848dcdc4e543d9e9eacbfb4b68eeb0039..3199681b6a813a6afeee1ad4b12846c5bf696569 100644 (file)
@@ -1177,8 +1177,6 @@ void                      tmpl_attr_set_leaf_num(tmpl_t *vpt, int16_t num) CC_HINT(nonnull);
 
 void                   tmpl_attr_rewrite_leaf_num(tmpl_t *vpt, int16_t from, int16_t to) CC_HINT(nonnull);
 
-void                   tmpl_attr_rewrite_num(tmpl_t *vpt, int16_t from, int16_t to) CC_HINT(nonnull);
-
 void                   tmpl_attr_set_request_ref(tmpl_t *vpt, FR_DLIST_HEAD(tmpl_request_list) const *request_def) CC_HINT(nonnull);
 
 void                   tmpl_attr_set_list(tmpl_t *vpt, fr_dict_attr_t const *list) CC_HINT(nonnull);
index f365147b1c15fe9c98d21fd1a0d20931f915615b..f2e50862b366dfd98b905ac8f82bc8afbd044331 100644 (file)
@@ -1197,21 +1197,27 @@ void tmpl_attr_rewrite_leaf_num(tmpl_t *vpt, int16_t from, int16_t to)
        if (tmpl_attr_list_num_elements(tmpl_attr(vpt)) == 0) return;
 
        ref = tmpl_attr_list_tail(tmpl_attr(vpt));
-       if (ref->ar_num == from) ref->ar_num = to;
 
-       TMPL_ATTR_VERIFY(vpt);
-}
+       switch (ref->ar_filter_type) {
+       case TMPL_ATTR_FILTER_TYPE_NONE:
+               if (from != NUM_UNSPEC) break;
 
-/** Rewrite all instances of an array number
- *
- */
-void tmpl_attr_rewrite_num(tmpl_t *vpt, int16_t from, int16_t to)
-{
-       tmpl_attr_t *ref = NULL;
+               ref->ar_filter_type = TMPL_ATTR_FILTER_TYPE_INDEX;
+               ref->ar_num = to;
+               break;
 
-       tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_attr_unresolved(vpt));
+       case TMPL_ATTR_FILTER_TYPE_INDEX:
+               if (ref->ar_num != from) break;
 
-       while ((ref = tmpl_attr_list_next(tmpl_attr(vpt), ref))) if (ref->ar_num == from) ref->ar_num = to;
+               ref->ar_num = to;
+               break;
+
+               /*
+                *      Don't rewrite non-index types.
+                */
+       default:
+               break;
+       }
 
        TMPL_ATTR_VERIFY(vpt);
 }