diff mbox series

[nft,v4,14/32] evaluate: relax type-checking for integer arguments in mark statements

Message ID 20220404121410.188509-15-jeremy@azazel.net
State Changes Requested
Delegated to: Pablo Neira
Headers show
Series Extend values assignable to packet marks and payload fields | expand

Commit Message

Jeremy Sowden April 4, 2022, 12:13 p.m. UTC
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.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
---
 src/evaluate.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Pablo Neira Ayuso May 23, 2022, 5:33 p.m. UTC | #1
On Mon, Apr 04, 2022 at 01:13:52PM +0100, Jeremy Sowden wrote:
> 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.

LGTM.

> Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
> ---
>  src/evaluate.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/src/evaluate.c b/src/evaluate.c
> index ee4da5a2b889..f975dd197de3 100644
> --- a/src/evaluate.c
> +++ b/src/evaluate.c
> @@ -2393,8 +2393,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",
> -- 
> 2.35.1
>
diff mbox series

Patch

diff --git a/src/evaluate.c b/src/evaluate.c
index ee4da5a2b889..f975dd197de3 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -2393,8 +2393,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",