diff mbox series

[nft,v4,11/32] netlink_delinearize: correct length of right bitwise operand

Message ID 20220404121410.188509-12-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
Set it to match the length of the left operand.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
---
 src/netlink_delinearize.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Pablo Neira Ayuso May 23, 2022, 5:22 p.m. UTC | #1
On Mon, Apr 04, 2022 at 01:13:49PM +0100, Jeremy Sowden wrote:
> Set it to match the length of the left operand.
> 
> Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
> ---
>  src/netlink_delinearize.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
> index 8b010fe4d168..cf5359bf269e 100644
> --- a/src/netlink_delinearize.c
> +++ b/src/netlink_delinearize.c
> @@ -2613,6 +2613,7 @@ static void expr_postprocess(struct rule_pp_ctx *ctx, struct expr **exprp)
>  				      BYTEORDER_HOST_ENDIAN);
>  			break;
>  		default:
> +			expr->right->len = expr->left->len;

This seems to be required for EXPR_BINOP (exclusing left/right shift)

I am assuming here expr->right is the value of the bitmask.

Was expr->right->len unset?

>  			expr_set_type(expr->right, expr->left->dtype,
>  				      expr->left->byteorder);
>  		}
> -- 
> 2.35.1
>
Jeremy Sowden Nov. 1, 2022, 6:47 p.m. UTC | #2
On 2022-05-23, at 19:22:02 +0200, Pablo Neira Ayuso wrote:
> On Mon, Apr 04, 2022 at 01:13:49PM +0100, Jeremy Sowden wrote:
> > Set it to match the length of the left operand.
> >
> > Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
> > ---
> >  src/netlink_delinearize.c | 1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
> > index 8b010fe4d168..cf5359bf269e 100644
> > --- a/src/netlink_delinearize.c
> > +++ b/src/netlink_delinearize.c
> > @@ -2613,6 +2613,7 @@ static void expr_postprocess(struct rule_pp_ctx *ctx, struct expr **exprp)
> >  				      BYTEORDER_HOST_ENDIAN);
> >  			break;
> >  		default:
> > +			expr->right->len = expr->left->len;
>
> This seems to be required for EXPR_BINOP (exclusing left/right shift)
>
> I am assuming here expr->right is the value of the bitmask.
>
> Was expr->right->len unset?

Hmm.  I can't now remember what purpose this served.  I spent a lot of
time staring at the delinearization code for binops and payloads while
debugging this series, and it is possible that I just spotted that under
some circumstances the length of the right hand operand after delinea-
rization wasn't right or didn't match what it did after evaluation, and
made this change for correctness.  However, reverting it doesn't seem to
break anything, so I'm happy to drop it.

> >  			expr_set_type(expr->right, expr->left->dtype,
> >  				      expr->left->byteorder);
> >  		}
> > --
> > 2.35.1
> >
>
diff mbox series

Patch

diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
index 8b010fe4d168..cf5359bf269e 100644
--- a/src/netlink_delinearize.c
+++ b/src/netlink_delinearize.c
@@ -2613,6 +2613,7 @@  static void expr_postprocess(struct rule_pp_ctx *ctx, struct expr **exprp)
 				      BYTEORDER_HOST_ENDIAN);
 			break;
 		default:
+			expr->right->len = expr->left->len;
 			expr_set_type(expr->right, expr->left->dtype,
 				      expr->left->byteorder);
 		}