]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
set flags correctly on n-ary ops
authorAlan T. DeKok <aland@freeradius.org>
Tue, 31 May 2022 14:15:00 +0000 (10:15 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 3 Jun 2022 11:15:51 +0000 (07:15 -0400)
src/lib/unlang/xlat_expr.c

index 79b4dcf2e41276871d097dbd552582b3a909e399..c4826c348fc0642c2ba79bf8bb74fd87afe589db 100644 (file)
@@ -1483,6 +1483,9 @@ redo:
         */
        if (nary_ops[op] && (lhs->type == XLAT_FUNC) && (lhs->call.func->token == op)) {
                xlat_func_append_arg(lhs, rhs);
+
+               lhs->call.args->flags.can_purify |= rhs->flags.can_purify | rhs->flags.pure;
+               lhs->flags.can_purify = lhs->call.args->flags.can_purify;
                goto redo;
        }
 
@@ -1521,7 +1524,16 @@ redo:
 
        fr_assert(xlat_exp_head(node->call.args) != NULL);
 
-       node->flags.can_purify = (node->call.func->flags.pure && node->call.args->flags.pure) | node->call.args->flags.can_purify;
+       if (nary_ops[op]) {
+               xlat_exp_foreach(node->call.args, arg) {
+                       node->call.args->flags.can_purify |= arg->flags.can_purify | arg->flags.pure;
+                       if (node->call.args->flags.can_purify) break;
+               }
+               node->flags.can_purify = node->call.args->flags.can_purify;
+
+       } else {
+               node->flags.can_purify = (node->call.func->flags.pure && node->call.args->flags.pure) | node->call.args->flags.can_purify;
+       }
 
        lhs = node;
        goto redo;