]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: keep prefix expression length
authorFlorian Westphal <fw@strlen.de>
Sat, 9 Apr 2022 13:58:25 +0000 (15:58 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Apr 2022 11:43:29 +0000 (13:43 +0200)
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 <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c
src/expression.c

index d5ae071add1f8ceefcfd57def205807476ccb1b3..a20cc396b33fa3c3e2c765507f9438f31d546e75 100644 (file)
@@ -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;
index 9c9a7ced91211bd19757aac8f99f8fdcc1696cd7..deb649e1847bb935735cf0a681c5a2c1fb663c0e 100644 (file)
@@ -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);