summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2025-02-28 15:55:04 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2025-03-07 13:56:46 +0100
commit6d9297f278290888e7e26762ee72ed6afa22a97e (patch)
treeca5f9cbb86257b9ba3280643680e1a3f39da11d2 /src
parent494a6ed120065b764f07acd05789b816625e8e13 (diff)
evaluate: simplify payload statement evaluation for bitfields
Instead of allocating a lshift expression and relying on the binary operation transfer propagate this to the mask value, lshift the mask value immediately. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r--src/evaluate.c21
1 files changed, 7 insertions, 14 deletions
diff --git a/src/evaluate.c b/src/evaluate.c
index f79667bd..c090aebe 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -3345,20 +3345,13 @@ static int stmt_evaluate_payload(struct eval_ctx *ctx, struct stmt *stmt)
}
}
- if (shift_imm) {
- struct expr *off, *lshift;
-
- off = constant_expr_alloc(&payload->location,
- expr_basetype(payload),
- BYTEORDER_HOST_ENDIAN,
- sizeof(shift_imm), &shift_imm);
-
- lshift = binop_expr_alloc(&payload->location, OP_LSHIFT,
- stmt->payload.val, off);
- lshift->dtype = payload->dtype;
- lshift->byteorder = payload->byteorder;
-
- stmt->payload.val = lshift;
+ switch (stmt->payload.val->etype) {
+ case EXPR_VALUE:
+ if (shift_imm)
+ mpz_lshift_ui(stmt->payload.val->value, shift_imm);
+ break;
+ default:
+ break;
}
masklen = payload_byte_size * BITS_PER_BYTE;