]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: exthdr: statement arg must be not be a range
authorFlorian Westphal <fw@strlen.de>
Thu, 14 Dec 2023 16:56:59 +0000 (17:56 +0100)
committerFlorian Westphal <fw@strlen.de>
Thu, 14 Dec 2023 20:50:50 +0000 (21:50 +0100)
Else we get:
BUG: unknown expression type range
nft: src/netlink_linearize.c:909: netlink_gen_expr: Assertion `0' failed.

Signed-off-by: Florian Westphal <fw@strlen.de>
src/evaluate.c
tests/shell/testcases/bogons/nft-f/exthdr_with_range_bug [new file with mode: 0644]

index 70d80eb4855612543f8379cdd8edd0528b5f4b31..1c5078d67c13ea88848d2ba5c6dbd44a33183112 100644 (file)
@@ -3024,14 +3024,27 @@ static bool stmt_evaluate_payload_need_csum(const struct expr *payload)
 static int stmt_evaluate_exthdr(struct eval_ctx *ctx, struct stmt *stmt)
 {
        struct expr *exthdr;
+       int ret;
 
        if (__expr_evaluate_exthdr(ctx, &stmt->exthdr.expr) < 0)
                return -1;
 
        exthdr = stmt->exthdr.expr;
-       return stmt_evaluate_arg(ctx, stmt, exthdr->dtype, exthdr->len,
-                                BYTEORDER_BIG_ENDIAN,
-                                &stmt->exthdr.val);
+       ret = stmt_evaluate_arg(ctx, stmt, exthdr->dtype, exthdr->len,
+                               BYTEORDER_BIG_ENDIAN,
+                               &stmt->exthdr.val);
+       if (ret < 0)
+               return ret;
+
+       switch (stmt->exthdr.val->etype) {
+       case EXPR_RANGE:
+               return expr_error(ctx->msgs, stmt->exthdr.val,
+                                  "cannot be a range");
+       default:
+               break;
+       }
+
+       return 0;
 }
 
 static int stmt_evaluate_payload(struct eval_ctx *ctx, struct stmt *stmt)
diff --git a/tests/shell/testcases/bogons/nft-f/exthdr_with_range_bug b/tests/shell/testcases/bogons/nft-f/exthdr_with_range_bug
new file mode 100644 (file)
index 0000000..e307e7c
--- /dev/null
@@ -0,0 +1 @@
+add rule t c ip option ra set 0-1