From: Florian Westphal Date: Sat, 9 Apr 2022 13:58:25 +0000 (+0200) Subject: evaluate: keep prefix expression length X-Git-Tag: v1.0.3~38 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ae7d32fc36d4e8714b392670ff2fd6af8135a322;p=thirdparty%2Fnftables.git evaluate: keep prefix expression length Else, range_expr_value_high() will see a 0 length when doing: mpz_init_bitmask(tmp, expr->len - expr->prefix_len); This wasn't a problem so far because prefix expressions generated from "string*" were never passed down to the prefix->range conversion functions. Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso --- diff --git a/src/evaluate.c b/src/evaluate.c index d5ae071a..a20cc396 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -347,6 +347,7 @@ static int expr_evaluate_string(struct eval_ctx *ctx, struct expr **exprp) datatype_set(prefix, ctx->ectx.dtype); prefix->flags |= EXPR_F_CONSTANT; prefix->byteorder = BYTEORDER_HOST_ENDIAN; + prefix->len = expr->len; expr_free(expr); *exprp = prefix; diff --git a/src/expression.c b/src/expression.c index 9c9a7ced..deb649e1 100644 --- a/src/expression.c +++ b/src/expression.c @@ -1465,6 +1465,7 @@ void range_expr_value_high(mpz_t rop, const struct expr *expr) return mpz_set(rop, expr->value); case EXPR_PREFIX: range_expr_value_low(rop, expr->prefix); + assert(expr->len >= expr->prefix_len); mpz_init_bitmask(tmp, expr->len - expr->prefix_len); mpz_add(rop, rop, tmp); mpz_clear(tmp);