diff options
author | Jeremy Sowden <jeremy@azazel.net> | 2020-03-03 09:48:29 +0000 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2020-03-04 23:36:27 +0100 |
commit | 4ac2cd199fbae8f52d43db7c817527ba1c5dedaa (patch) | |
tree | 801d10a5629204b282d14ee24e1b869efce2fb2a | |
parent | 5f38f3f3afe48213e34654b5a5464af67e40a0e5 (diff) |
evaluate: don't evaluate payloads twice.
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>
-rw-r--r-- | include/expression.h | 1 | ||||
-rw-r--r-- | src/evaluate.c | 5 |
2 files changed, 6 insertions, 0 deletions
diff --git a/include/expression.h b/include/expression.h index 62fbbbb5..87c39e5d 100644 --- a/include/expression.h +++ b/include/expression.h @@ -300,6 +300,7 @@ struct expr { enum proto_bases base; unsigned int offset; bool is_raw; + bool evaluated; } payload; struct { /* EXPR_EXTHDR */ diff --git a/src/evaluate.c b/src/evaluate.c index e2eff235..a169e41b 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -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; } |