From: Pablo Neira Ayuso Date: Thu, 23 Mar 2023 11:52:39 +0000 (+0100) Subject: evaluate: honor statement length in integer evaluation X-Git-Tag: v1.0.6.1~187 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7f994db65db8969644133def6daac9c10bf5274f;p=thirdparty%2Fnftables.git evaluate: honor statement length in integer evaluation 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 --- diff --git a/src/evaluate.c b/src/evaluate.c index 80023834..8a7f95f3 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -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; }