]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: relax type-checking for integer arguments in mark statements
authorJeremy Sowden <jeremy@azazel.net>
Mon, 4 Apr 2022 12:13:52 +0000 (13:13 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 7 Feb 2023 11:50:39 +0000 (12:50 +0100)
In order to be able to set ct and meta marks to values derived from
payload expressions, we need to relax the requirement that the type of
the statement argument must match that of the statement key.  Instead,
we require that the base-type of the argument is integer and that the
argument is small enough to fit.

Add one testcase for tests/py.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
src/evaluate.c
tests/py/ip/meta.t
tests/py/ip/meta.t.json
tests/py/ip/meta.t.payload

index 128b750406e5941ac5387a8d3f3ad45522b8cf75..fe6384a48e1400bc03257493a15a69c4adc75364 100644 (file)
@@ -2690,8 +2690,12 @@ static int __stmt_evaluate_arg(struct eval_ctx *ctx, struct stmt *stmt,
                                         "expression has type %s with length %d",
                                         dtype->desc, (*expr)->dtype->desc,
                                         (*expr)->len);
-       else if ((*expr)->dtype->type != TYPE_INTEGER &&
-                !datatype_equal((*expr)->dtype, dtype))
+
+       if ((dtype->type == TYPE_MARK &&
+            !datatype_equal(datatype_basetype(dtype), datatype_basetype((*expr)->dtype))) ||
+           (dtype->type != TYPE_MARK &&
+            (*expr)->dtype->type != TYPE_INTEGER &&
+            !datatype_equal((*expr)->dtype, dtype)))
                return stmt_binary_error(ctx, *expr, stmt,              /* verdict vs invalid? */
                                         "datatype mismatch: expected %s, "
                                         "expression has type %s",
index 5a05923a1ce135efba48868d43b13c007b9ccfce..85eaf54ce72339031a69aaf9cbfd9b75c71c5e2d 100644 (file)
@@ -15,3 +15,5 @@ meta obrname "br0";fail
 
 meta sdif "lo" accept;ok
 meta sdifname != "vrf1" accept;ok
+
+meta mark set ip dscp;ok
index 3df31ce381fc80e7c7ac520402a3c166ce68d5d5..a93d7e781ce1123121140a2cf26bff8c1434fb45 100644 (file)
         }
     }
 ]
+
+# meta mark set ip dscp
+[
+    {
+        "mangle": {
+            "key": {
+                "meta": {
+                    "key": "mark"
+                }
+            },
+            "value": {
+                "payload": {
+                    "field": "dscp",
+                    "protocol": "ip"
+                }
+            }
+        }
+    }
+]
+
index afde5cc13ac5e0334d20046846342327028109f5..1aa8d003b1d44ab5aeaa5f63b93be8cea33edc1f 100644 (file)
@@ -51,3 +51,11 @@ ip test-ip4 input
   [ cmp eq reg 1 0x00000011 ]
   [ payload load 2b @ transport header + 2 => reg 1 ]
   [ cmp eq reg 1 0x00004300 ]
+
+# meta mark set ip dscp
+ip test-ip4 input
+  [ payload load 1b @ network header + 1 => reg 1 ]
+  [ bitwise reg 1 = ( reg 1 & 0x000000fc ) ^ 0x00000000 ]
+  [ bitwise reg 1 = ( reg 1 >> 0x00000002 ) ]
+  [ meta set mark with reg 1 ]
+