diff options
author | Jeremy Sowden <jeremy@azazel.net> | 2020-03-03 09:48:27 +0000 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2020-03-04 23:31:55 +0100 |
commit | 61d93d5fd35c9cbb3c71acc8e3fcc3be82ed3d9e (patch) | |
tree | 834fd6997ddb9cec2ce3a892b3c15aab439fc413 /src | |
parent | d42bd56cff1a22301703d2b9d6d6fc937ea7cfbd (diff) |
evaluate: add separate variables for lshift and xor binops.
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/evaluate.c | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index b38ac931..fda30fd8 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -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); } |