From: Pablo Neira Ayuso Date: Fri, 28 Feb 2025 14:55:04 +0000 (+0100) Subject: evaluate: simplify payload statement evaluation for bitfields X-Git-Tag: v1.1.2~60 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6d9297f278290888e7e26762ee72ed6afa22a97e;p=thirdparty%2Fnftables.git 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 --- 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;