]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
2nd attempt to clean up "set leaf num" API
authorNick Porter <nick@portercomputing.co.uk>
Mon, 2 Sep 2024 15:35:39 +0000 (16:35 +0100)
committerNick Porter <nick@portercomputing.co.uk>
Mon, 2 Sep 2024 15:35:39 +0000 (16:35 +0100)
update section lhs doesn't need &attr changed to &attr[*]

src/lib/server/tmpl.h
src/lib/server/tmpl_tokenize.c
src/lib/unlang/compile.c

index 443e8f26580d9cf3f3d184bea4fec874012c6dfe..4ce7dbc3315670c258c93d125c8c988cd6b10d27 100644 (file)
@@ -1189,9 +1189,7 @@ int                       tmpl_attr_set_da(tmpl_t *vpt, fr_dict_attr_t const *da) CC_HINT(nonnull);
 
 int                    tmpl_attr_set_leaf_da(tmpl_t *vpt, fr_dict_attr_t const *da) CC_HINT(nonnull);
 
-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_leaf_num(tmpl_t *vpt, int16_t num) CC_HINT(nonnull);
 
 void                   tmpl_attr_set_request_ref(tmpl_t *vpt, FR_DLIST_HEAD(tmpl_request_list) const *request_def) CC_HINT(nonnull);
 
index ee39fe842d704392aaedc20eb7e4e90a435d610c..f4f79c444a33eb934c2ff1ec72f61137d6bcfb58 100644 (file)
@@ -1175,28 +1175,16 @@ int tmpl_attr_set_leaf_da(tmpl_t *vpt, fr_dict_attr_t const *da)
        return 0;
 }
 
-void tmpl_attr_set_leaf_num(tmpl_t *vpt, int16_t num)
-{
-       tmpl_attr_t *ar;
-
-       tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_attr_unresolved(vpt));
-
-       if (tmpl_attr_list_num_elements(tmpl_attr(vpt)) == 0) {
-               ar = tmpl_attr_add(vpt, TMPL_ATTR_TYPE_UNKNOWN);
-       } else {
-               ar = tmpl_attr_list_tail(tmpl_attr(vpt));
-       }
-
-       ar->ar_filter_type = TMPL_ATTR_FILTER_TYPE_INDEX;
-       ar->ar_num = num;
-
-       TMPL_ATTR_VERIFY(vpt);
-}
-
 /** Rewrite the leaf's instance number
  *
+ *  This function is _only_ called from the compiler, for "update" and "foreach" keywords.  In those cases,
+ *  the user historically did "&foo-bar", but really meant "&foo-bar[*]".  We silently update that for
+ *  "update" sections, and complain about it in "foreach" sections.
+ *
+ *  As the server now supports multiple types of leaf references, we do the rewrite _only_ from "none" (no
+ *  filter), OR where it's a numerical index, AND the index hasn't been specified.
  */
-void tmpl_attr_rewrite_leaf_num(tmpl_t *vpt, int16_t from, int16_t to)
+void tmpl_attr_rewrite_leaf_num(tmpl_t *vpt, int16_t to)
 {
        tmpl_attr_t *ref = NULL;
 
@@ -1205,7 +1193,17 @@ 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;
+
+       if (ref->ar_filter_type == TMPL_ATTR_FILTER_TYPE_NONE) {
+               ref->ar_filter_type = TMPL_ATTR_FILTER_TYPE_INDEX;
+               ref->ar_num = to;
+
+       } else if (ref->ar_filter_type != TMPL_ATTR_FILTER_TYPE_INDEX) {
+               return;
+
+       } else if (ref->ar_num == NUM_UNSPEC) {
+               ref->ar_num = to;
+       }
 
        TMPL_ATTR_VERIFY(vpt);
 }
index 3ff2a331b242faffc6503142ffa7c9a234787fe6..bcd193e624efdf2cf7d14d66f74f1c526e91a5cf 100644 (file)
@@ -484,25 +484,13 @@ int unlang_fixup_update(map_t *map, void *ctx)
                }
        }
 
-       /*
-        *      Fixup LHS attribute references to change NUM_UNSPEC to NUM_ALL, but only for "update" sections.
-        */
        if (!ctx) {
-               switch (map->lhs->type) {
-               case TMPL_TYPE_ATTR:
-                       if (!tmpl_is_list(map->lhs)) tmpl_attr_rewrite_leaf_num(map->lhs, NUM_UNSPEC, NUM_ALL);
-                       break;
-
-               default:
-                       break;
-               }
-
                /*
                 *      Fixup RHS attribute references to change NUM_UNSPEC to NUM_ALL.
                 */
                switch (map->rhs->type) {
                case TMPL_TYPE_ATTR:
-                       if (!tmpl_is_list(map->rhs)) tmpl_attr_rewrite_leaf_num(map->rhs, NUM_UNSPEC, NUM_ALL);
+                       if (!tmpl_is_list(map->rhs)) tmpl_attr_rewrite_leaf_num(map->rhs, NUM_ALL);
                        break;
 
                default:
@@ -3308,7 +3296,7 @@ static unlang_t *compile_foreach(unlang_t *parent, unlang_compile_t *unlang_ctx,
 
        if (tmpl_attr_tail_num(vpt) == NUM_UNSPEC) {
                cf_log_warn(cs, "Attribute reference should be updated to use %s[*]", vpt->name);
-               tmpl_attr_set_leaf_num(vpt, NUM_ALL);
+               tmpl_attr_rewrite_leaf_num(vpt, NUM_ALL);
        }
 
        if (tmpl_attr_tail_num(vpt) != NUM_ALL) {