summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Sowden <jeremy@azazel.net>2020-03-03 09:48:29 +0000
committerFlorian Westphal <fw@strlen.de>2020-03-04 23:36:27 +0100
commit4ac2cd199fbae8f52d43db7c817527ba1c5dedaa (patch)
tree801d10a5629204b282d14ee24e1b869efce2fb2a
parent5f38f3f3afe48213e34654b5a5464af67e40a0e5 (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.h1
-rw-r--r--src/evaluate.c5
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;
}