]> git.itanic.dy.fi Git - linux-stable/commitdiff
netfilter: nf_tables: permit update of set size
authorFlorian Westphal <fw@strlen.de>
Tue, 6 Jun 2023 12:08:49 +0000 (14:08 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 26 Jun 2023 06:05:57 +0000 (08:05 +0200)
Now that set->nelems is always updated permit update of the sets max size.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/net/netfilter/nf_tables.h
net/netfilter/nf_tables_api.c

index 2e24ea1d744c25e7dc5c3550d36f33d733c581a2..89b1ac4e6d4a245c856841be1128289ca3f12ae4 100644 (file)
@@ -1589,6 +1589,7 @@ struct nft_trans_set {
        u64                             timeout;
        bool                            update;
        bool                            bound;
+       u32                             size;
 };
 
 #define nft_trans_set(trans)   \
@@ -1603,6 +1604,8 @@ struct nft_trans_set {
        (((struct nft_trans_set *)trans->data)->timeout)
 #define nft_trans_set_gc_int(trans)    \
        (((struct nft_trans_set *)trans->data)->gc_int)
+#define nft_trans_set_size(trans)      \
+       (((struct nft_trans_set *)trans->data)->size)
 
 struct nft_trans_chain {
        bool                            update;
index 0396fd8f4e7127fde3be05b137334aa7025f17cd..dfd441ff1e3ee4a81721da83be9b859f4e269fc4 100644 (file)
@@ -483,6 +483,7 @@ static int __nft_trans_set_add(const struct nft_ctx *ctx, int msg_type,
                nft_trans_set_update(trans) = true;
                nft_trans_set_gc_int(trans) = desc->gc_int;
                nft_trans_set_timeout(trans) = desc->timeout;
+               nft_trans_set_size(trans) = desc->size;
        }
        nft_trans_commit_list_add_tail(ctx->net, trans);
 
@@ -9428,6 +9429,9 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
 
                                WRITE_ONCE(set->timeout, nft_trans_set_timeout(trans));
                                WRITE_ONCE(set->gc_int, nft_trans_set_gc_int(trans));
+
+                               if (nft_trans_set_size(trans))
+                                       WRITE_ONCE(set->size, nft_trans_set_size(trans));
                        } else {
                                nft_clear(net, nft_trans_set(trans));
                                /* This avoids hitting -EBUSY when deleting the table