diff options
| author | Florian Westphal <fw@strlen.de> | 2025-06-06 14:12:36 +0200 |
|---|---|---|
| committer | Florian Westphal <fw@strlen.de> | 2025-06-22 19:18:45 +0200 |
| commit | 10b44319a53a131ed943e2b6eeb62d197178bf4d (patch) | |
| tree | 6aa9d69e6430cc6c9f229326a5e81beb66e894ed /src | |
| parent | 9352fa7fb0a3191d5c811ced9031e7ec3d6d152b (diff) | |
evaluate: rename recursion counter to recursion.binop
The existing recursion counter is used by the binop expression to detect
if we've completely followed all the binops.
We can only chain up to NFT_MAX_EXPR_RECURSION binops, but the evaluation
step can perform constant-folding, so we must recurse until we found the
rightmost (last) binop in the chain.
Then we can check the post-eval chain to see if it is something that can
be serialized later (i.e., if we are within the NFT_MAX_EXPR_RECURSION
after constant folding) or not.
Thus we can't reuse the existing ctx->recursion counter for other
expressions; entering the initial expr_evaluate_binop with
ctx->recursion > 0 would break things.
Therefore rename this to an embedded structure.
This allows us to add a new recursion counter in a followup patch.
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'src')
| -rw-r--r-- | src/evaluate.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index 872a9e0d..77bdb9cd 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -1520,11 +1520,11 @@ static int expr_evaluate_binop(struct eval_ctx *ctx, struct expr **expr) unsigned int max_shift_len = ctx->ectx.len; int ret = -1; - if (ctx->recursion >= USHRT_MAX) + if (ctx->recursion.binop >= USHRT_MAX) return expr_binary_error(ctx->msgs, op, NULL, "Binary operation limit %u reached ", - ctx->recursion); - ctx->recursion++; + ctx->recursion.binop); + ctx->recursion.binop++; if (expr_evaluate(ctx, &op->left) < 0) return -1; @@ -1609,7 +1609,7 @@ static int expr_evaluate_binop(struct eval_ctx *ctx, struct expr **expr) } - if (ctx->recursion == 0) + if (ctx->recursion.binop == 0) BUG("recursion counter underflow"); /* can't check earlier: evaluate functions might do constant-merging + expr_free. @@ -1617,7 +1617,7 @@ static int expr_evaluate_binop(struct eval_ctx *ctx, struct expr **expr) * So once we've evaluate everything check for remaining length of the * binop chain. */ - if (--ctx->recursion == 0) { + if (--ctx->recursion.binop == 0) { unsigned int to_linearize = 0; op = *expr; |
