summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;
}