[prev in list] [next in list] [prev in thread] [next in thread]
List: netfilter-devel
Subject: [PATCH nft v5 5/8] evaluate: preserve existing binop properties
From: Jeremy Sowden <jeremy () azazel ! net>
Date: 2023-05-28 14:00:55
Message-ID: 20230528140058.1218669-6-jeremy () azazel ! net
[Download RAW message or body]
In certain cases, such as evaluating payload statement arguments, we
allocate new binop expressions and set properties such as length,
data-type and byte-order. When the new expressions are themselves
evaluated, these properties are overridden. Since the length of
expression is set in all cases, check for this and preserve the length,
data-type and byte-order for bitwise op's and the length for shifts.
Remove a couple of superfluous assignments for a left-shift which were
being correctly overridden.
Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
---
src/evaluate.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/evaluate.c b/src/evaluate.c
index 77781f0ec6de..136b4539e828 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -1301,7 +1301,9 @@ static int expr_evaluate_shift(struct eval_ctx *ctx, struct expr **expr)
unsigned int shift = mpz_get_uint32(right->value);
unsigned int max_shift_len;
- if (ctx->stmt_len > left->len)
+ if (op->len)
+ max_shift_len = op->len;
+ else if (ctx->stmt_len > left->len)
max_shift_len = ctx->stmt_len;
else
max_shift_len = left->len;
@@ -1335,7 +1337,16 @@ static int expr_evaluate_bitwise(struct eval_ctx *ctx, struct expr **expr)
unsigned int max_len;
int byteorder;
- if (ctx->stmt_len > left->len) {
+ if (op->len) {
+ max_len = op->len;
+ byteorder = op->byteorder;
+ dtype = op->dtype;
+
+ if (byteorder_conversion(ctx, &op->left, byteorder) < 0)
+ return -1;
+
+ left = op->left;
+ } else if (ctx->stmt_len > left->len) {
max_len = ctx->stmt_len;
byteorder = BYTEORDER_HOST_ENDIAN;
dtype = &integer_type;
@@ -2962,8 +2973,6 @@ static int stmt_evaluate_payload(struct eval_ctx *ctx, struct stmt *stmt)
lshift = binop_expr_alloc(&payload->location, OP_LSHIFT,
stmt->payload.val, off);
- lshift->dtype = payload->dtype;
- lshift->byteorder = payload->byteorder;
stmt->payload.val = lshift;
}
--
2.39.2
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic