]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: honor statement length in integer evaluation
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 23 Mar 2023 11:52:39 +0000 (12:52 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 23 Jan 2025 00:35:36 +0000 (01:35 +0100)
commit 3c64ea7995cbbc4f1d9d7707f907667325eb62b9 upstream.

Otherwise, bogus error is reported:

 # nft --debug=netlink add rule ip x y 'ct mark set ip dscp & 0x0f << 1 | 0xff000000'
 Error: Value 4278190080 exceeds valid range 0-63
 add rule ip x y ct mark set ip dscp & 0x0f << 1 | 0xff000000
                                                   ^^^^^^^^^^

Use the statement length as the maximum value in the mark statement
expression.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c

index 80023834410a3278a6e265f9dc81c4cb09f55db9..8a7f95f32686f59f5e8c27f178e051ba63afccc7 100644 (file)
@@ -423,6 +423,7 @@ static int expr_evaluate_integer(struct eval_ctx *ctx, struct expr **exprp)
 {
        struct expr *expr = *exprp;
        char *valstr, *rangestr;
+       uint32_t masklen;
        mpz_t mask;
 
        if (ctx->ectx.maxval > 0 &&
@@ -435,7 +436,12 @@ static int expr_evaluate_integer(struct eval_ctx *ctx, struct expr **exprp)
                return -1;
        }
 
-       mpz_init_bitmask(mask, ctx->ectx.len);
+       if (ctx->stmt_len > ctx->ectx.len)
+               masklen = ctx->stmt_len;
+       else
+               masklen = ctx->ectx.len;
+
+       mpz_init_bitmask(mask, masklen);
        if (mpz_cmp(expr->value, mask) > 0) {
                valstr = mpz_get_str(NULL, 10, expr->value);
                rangestr = mpz_get_str(NULL, 10, mask);
@@ -448,7 +454,7 @@ static int expr_evaluate_integer(struct eval_ctx *ctx, struct expr **exprp)
                return -1;
        }
        expr->byteorder = ctx->ectx.byteorder;
-       expr->len = ctx->ectx.len;
+       expr->len = masklen;
        mpz_clear(mask);
        return 0;
 }