]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: simplify payload statement evaluation for bitfields
authorPablo Neira Ayuso <pablo@netfilter.org>
Fri, 28 Feb 2025 14:55:04 +0000 (15:55 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 7 Mar 2025 12:56:46 +0000 (13:56 +0100)
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>
src/evaluate.c

index f79667bd41ea8cc1e64c8e5f3ede70b5aa6f0620..c090aebe2cca87d9a5da5ff8c7e394a7e73a60ca 100644 (file)
@@ -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;