diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2025-02-28 15:55:04 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2025-03-07 13:56:46 +0100 |
commit | 6d9297f278290888e7e26762ee72ed6afa22a97e (patch) | |
tree | ca5f9cbb86257b9ba3280643680e1a3f39da11d2 /src | |
parent | 494a6ed120065b764f07acd05789b816625e8e13 (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.c | 21 |
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; |