netfilter: nft_numgen: cancel register tracking
authorPablo Neira Ayuso <pablo@netfilter.org>
Mon, 14 Mar 2022 17:23:05 +0000 (18:23 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sat, 19 Mar 2022 23:29:47 +0000 (00:29 +0100)
Random and increment are stateful, each invocation results in fresh output.
Cancel register tracking for these two expressions.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nft_numgen.c

index 1d378ef..81b40c6 100644 (file)
@@ -85,6 +85,16 @@ err:
        return err;
 }
 
+static bool nft_ng_inc_reduce(struct nft_regs_track *track,
+                                const struct nft_expr *expr)
+{
+       const struct nft_ng_inc *priv = nft_expr_priv(expr);
+
+       nft_reg_track_cancel(track, priv->dreg, NFT_REG32_SIZE);
+
+       return false;
+}
+
 static int nft_ng_dump(struct sk_buff *skb, enum nft_registers dreg,
                       u32 modulus, enum nft_ng_types type, u32 offset)
 {
@@ -172,6 +182,16 @@ static int nft_ng_random_dump(struct sk_buff *skb, const struct nft_expr *expr)
                           priv->offset);
 }
 
+static bool nft_ng_random_reduce(struct nft_regs_track *track,
+                                const struct nft_expr *expr)
+{
+       const struct nft_ng_random *priv = nft_expr_priv(expr);
+
+       nft_reg_track_cancel(track, priv->dreg, NFT_REG32_SIZE);
+
+       return false;
+}
+
 static struct nft_expr_type nft_ng_type;
 static const struct nft_expr_ops nft_ng_inc_ops = {
        .type           = &nft_ng_type,
@@ -180,6 +200,7 @@ static const struct nft_expr_ops nft_ng_inc_ops = {
        .init           = nft_ng_inc_init,
        .destroy        = nft_ng_inc_destroy,
        .dump           = nft_ng_inc_dump,
+       .reduce         = nft_ng_inc_reduce,
 };
 
 static const struct nft_expr_ops nft_ng_random_ops = {
@@ -188,6 +209,7 @@ static const struct nft_expr_ops nft_ng_random_ops = {
        .eval           = nft_ng_random_eval,
        .init           = nft_ng_random_init,
        .dump           = nft_ng_random_dump,
+       .reduce         = nft_ng_random_reduce,
 };
 
 static const struct nft_expr_ops *