]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: add separate variables for lshift and xor binops.
authorJeremy Sowden <jeremy@azazel.net>
Tue, 3 Mar 2020 09:48:27 +0000 (09:48 +0000)
committerFlorian Westphal <fw@strlen.de>
Wed, 4 Mar 2020 22:31:55 +0000 (23:31 +0100)
stmt_evaluate_payload has distinct variables for some, but not all, the
binop expressions it creates.  Add variables for the rest.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Florian Westphal <fw@strlen.de>
src/evaluate.c

index b38ac93106568f03b3449d29442bb470448b2b72..fda30fd8001efd5b32df2f27643105afde9653b1 100644 (file)
@@ -2204,7 +2204,7 @@ static int stmt_evaluate_exthdr(struct eval_ctx *ctx, struct stmt *stmt)
 
 static int stmt_evaluate_payload(struct eval_ctx *ctx, struct stmt *stmt)
 {
-       struct expr *binop, *mask, *and, *payload_bytes;
+       struct expr *mask, *and, *xor, *payload_bytes;
        unsigned int masklen, extra_len = 0;
        unsigned int payload_byte_size, payload_byte_offset;
        uint8_t shift_imm, data[NFT_REG_SIZE];
@@ -2251,22 +2251,21 @@ static int stmt_evaluate_payload(struct eval_ctx *ctx, struct stmt *stmt)
        }
 
        if (shift_imm) {
-               struct expr *off;
+               struct expr *off, *lshift;
 
                off = constant_expr_alloc(&payload->location,
                                          expr_basetype(payload),
                                          BYTEORDER_HOST_ENDIAN,
                                          sizeof(shift_imm), &shift_imm);
 
-               binop = binop_expr_alloc(&payload->location, OP_LSHIFT,
-                                        stmt->payload.val, off);
-               binop->dtype            = payload->dtype;
-               binop->byteorder        = payload->byteorder;
+               lshift = binop_expr_alloc(&payload->location, OP_LSHIFT,
+                                         stmt->payload.val, off);
+               lshift->dtype     = payload->dtype;
+               lshift->byteorder = payload->byteorder;
 
-               stmt->payload.val = binop;
+               stmt->payload.val = lshift;
        }
 
-
        masklen = payload_byte_size * BITS_PER_BYTE;
        mpz_init_bitmask(ff, masklen);
 
@@ -2295,16 +2294,17 @@ static int stmt_evaluate_payload(struct eval_ctx *ctx, struct stmt *stmt)
 
        and = binop_expr_alloc(&payload->location, OP_AND, payload_bytes, mask);
 
-       and->dtype               = payload_bytes->dtype;
-       and->byteorder           = payload_bytes->byteorder;
-       and->len                 = payload_bytes->len;
+       and->dtype      = payload_bytes->dtype;
+       and->byteorder  = payload_bytes->byteorder;
+       and->len        = payload_bytes->len;
+
+       xor = binop_expr_alloc(&payload->location, OP_XOR, and,
+                              stmt->payload.val);
+       xor->dtype      = payload->dtype;
+       xor->byteorder  = payload->byteorder;
+       xor->len        = mask->len;
 
-       binop = binop_expr_alloc(&payload->location, OP_XOR, and,
-                                stmt->payload.val);
-       binop->dtype            = payload->dtype;
-       binop->byteorder        = payload->byteorder;
-       binop->len              = mask->len;
-       stmt->payload.val = binop;
+       stmt->payload.val = xor;
 
        return expr_evaluate(ctx, &stmt->payload.val);
 }