]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
allow for pruning of xlat walk
authorAlan T. DeKok <aland@freeradius.org>
Tue, 24 May 2022 14:18:52 +0000 (10:18 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 24 May 2022 20:46:47 +0000 (16:46 -0400)
src/lib/unlang/xlat_eval.c
src/lib/unlang/xlat_priv.h

index d4abaa9920bcca91fe44c199d7b2f3435045e3f2..d8410a3a4193955b5b76471dced635f4d2c76ca4 100644 (file)
@@ -1719,6 +1719,7 @@ int xlat_eval_walk(xlat_exp_head_t *head, xlat_walker_t walker, xlat_type_t type
                        if (!type || (type & XLAT_FUNC)) {
                                ret = walker(node, uctx);
                                if (ret < 0) return ret;
+                               if (ret > 0) return 0;
                        }
                        break;
 
@@ -1726,6 +1727,7 @@ int xlat_eval_walk(xlat_exp_head_t *head, xlat_walker_t walker, xlat_type_t type
                        if (!type || (type & XLAT_FUNC_UNRESOLVED)) {
                                ret = walker(node, uctx);
                                if (ret < 0) return ret;
+                               if (ret > 0) return 0;
                        }
 
                        /*
@@ -1741,6 +1743,7 @@ int xlat_eval_walk(xlat_exp_head_t *head, xlat_walker_t walker, xlat_type_t type
                        if (!type || (type & XLAT_ALTERNATE)) {
                                ret = walker(node, uctx);
                                if (ret < 0) return ret;
+                               if (ret > 0) return 0;
                        }
 
                        /*
@@ -1760,6 +1763,7 @@ int xlat_eval_walk(xlat_exp_head_t *head, xlat_walker_t walker, xlat_type_t type
                        if (!type || (type & XLAT_GROUP)) {
                                ret = walker(node, uctx);
                                if (ret < 0) return ret;
+                               if (ret > 0) return 0;
                        }
 
                        /*
@@ -1773,6 +1777,7 @@ int xlat_eval_walk(xlat_exp_head_t *head, xlat_walker_t walker, xlat_type_t type
                        if (!type || (type & node->type)) {
                                ret = walker(node, uctx);
                                if (ret < 0) return ret;
+                               if (ret > 0) return 0;
                        }
                }
        }
index 356e9c371dea1960c0a19fef1853efcfa2485961..06020c690db464c7d1de690eb7c4626042eb2c6f 100644 (file)
@@ -286,6 +286,7 @@ static inline void xlat_resolve_set(xlat_t *xlat, xlat_resolve_t func)
  * @param[in] exp      being evaluated.
  * @param[in] uctx     passed to xlat_walk.
  * @return
+ *     - 1 for "prune walk here".
  *     - 0 on success.
  *     - <0 if node evaluation failed.  Causes xlat_walk to return the negative integer.
  */