]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: don't evaluate payloads twice.
authorJeremy Sowden <jeremy@azazel.net>
Tue, 3 Mar 2020 09:48:29 +0000 (09:48 +0000)
committerFlorian Westphal <fw@strlen.de>
Wed, 4 Mar 2020 22:36:27 +0000 (23:36 +0100)
Payload munging means that evaluation of payload expressions may not be
idempotent.  Add a flag to prevent them from being evaluated more than
once.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Florian Westphal <fw@strlen.de>
include/expression.h
src/evaluate.c

index 62fbbbb5a737209d7835755fc7843f31ec99c8b8..87c39e5de08a6fb23109bb5df80d04bc8353125b 100644 (file)
@@ -300,6 +300,7 @@ struct expr {
                        enum proto_bases                base;
                        unsigned int                    offset;
                        bool                            is_raw;
+                       bool                            evaluated;
                } payload;
                struct {
                        /* EXPR_EXTHDR */
index e2eff23536576dea3176a8268374fdb0a6ae09cc..a169e41bd83325e4c19bcb3b9b7a7cecc5faa482 100644 (file)
@@ -736,6 +736,9 @@ static int expr_evaluate_payload(struct eval_ctx *ctx, struct expr **exprp)
 {
        struct expr *expr = *exprp;
 
+       if (expr->payload.evaluated)
+               return 0;
+
        if (__expr_evaluate_payload(ctx, expr) < 0)
                return -1;
 
@@ -745,6 +748,8 @@ static int expr_evaluate_payload(struct eval_ctx *ctx, struct expr **exprp)
        if (payload_needs_adjustment(expr))
                expr_evaluate_bits(ctx, exprp);
 
+       expr->payload.evaluated = true;
+
        return 0;
 }