netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org, netfilter-devel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev, Pablo Neira Ayuso <pablo@netfilter.org>,
	Florian Westphal <fw@strlen.de>
Subject: [PATCH 5.4 153/159] netfilter: nf_tables: fix memleak when more than 255 elements expired
Date: Fri, 24 Nov 2023 17:56:10 +0000	[thread overview]
Message-ID: <20231124171948.158839044@linuxfoundation.org> (raw)
In-Reply-To: <20231124171941.909624388@linuxfoundation.org>

5.4-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Pablo Neira Ayuso <pablo@netfilter.org>

commit cf5000a7787cbc10341091d37245a42c119d26c5 upstream.

When more than 255 elements expired we're supposed to switch to a new gc
container structure.

This never happens: u8 type will wrap before reaching the boundary
and nft_trans_gc_space() always returns true.

This means we recycle the initial gc container structure and
lose track of the elements that came before.

While at it, don't deref 'gc' after we've passed it to call_rcu.

Fixes: 5f68718b34a5 ("netfilter: nf_tables: GC transaction API to avoid race with control plane")
Reported-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 include/net/netfilter/nf_tables.h |    2 +-
 net/netfilter/nf_tables_api.c     |   10 ++++++++--
 2 files changed, 9 insertions(+), 3 deletions(-)

--- a/include/net/netfilter/nf_tables.h
+++ b/include/net/netfilter/nf_tables.h
@@ -1440,7 +1440,7 @@ struct nft_trans_gc {
 	struct net		*net;
 	struct nft_set		*set;
 	u32			seq;
-	u8			count;
+	u16			count;
 	void			*priv[NFT_TRANS_GC_BATCHCOUNT];
 	struct rcu_head		rcu;
 };
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -7089,12 +7089,15 @@ static int nft_trans_gc_space(struct nft
 struct nft_trans_gc *nft_trans_gc_queue_async(struct nft_trans_gc *gc,
 					      unsigned int gc_seq, gfp_t gfp)
 {
+	struct nft_set *set;
+
 	if (nft_trans_gc_space(gc))
 		return gc;
 
+	set = gc->set;
 	nft_trans_gc_queue_work(gc);
 
-	return nft_trans_gc_alloc(gc->set, gc_seq, gfp);
+	return nft_trans_gc_alloc(set, gc_seq, gfp);
 }
 EXPORT_SYMBOL_GPL(nft_trans_gc_queue_async);
 
@@ -7111,15 +7114,18 @@ EXPORT_SYMBOL_GPL(nft_trans_gc_queue_asy
 
 struct nft_trans_gc *nft_trans_gc_queue_sync(struct nft_trans_gc *gc, gfp_t gfp)
 {
+	struct nft_set *set;
+
 	if (WARN_ON_ONCE(!lockdep_commit_lock_is_held(gc->net)))
 		return NULL;
 
 	if (nft_trans_gc_space(gc))
 		return gc;
 
+	set = gc->set;
 	call_rcu(&gc->rcu, nft_trans_gc_trans_free);
 
-	return nft_trans_gc_alloc(gc->set, 0, gfp);
+	return nft_trans_gc_alloc(set, 0, gfp);
 }
 EXPORT_SYMBOL_GPL(nft_trans_gc_queue_sync);
 



  parent reply	other threads:[~2023-11-24 19:28 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20231124171941.909624388@linuxfoundation.org>
2023-11-24 17:55 ` [PATCH 5.4 134/159] netfilter: nf_tables: pass context to nft_set_destroy() Greg Kroah-Hartman
2023-11-24 17:55 ` [PATCH 5.4 135/159] netfilter: nftables: rename set element data activation/deactivation functions Greg Kroah-Hartman
2023-11-24 17:55 ` [PATCH 5.4 136/159] netfilter: nf_tables: drop map element references from preparation phase Greg Kroah-Hartman
2023-11-24 17:55 ` [PATCH 5.4 137/159] netfilter: nft_set_rbtree: Switch to node list walk for overlap detection Greg Kroah-Hartman
2023-11-24 17:55 ` [PATCH 5.4 138/159] netfilter: nft_set_rbtree: fix null deref on element insertion Greg Kroah-Hartman
2023-11-24 17:55 ` [PATCH 5.4 139/159] netfilter: nft_set_rbtree: fix overlap expiration walk Greg Kroah-Hartman
2023-11-24 17:55 ` [PATCH 5.4 140/159] netfilter: nf_tables: dont skip expired elements during walk Greg Kroah-Hartman
2023-11-24 17:55 ` [PATCH 5.4 141/159] netfilter: nf_tables: GC transaction API to avoid race with control plane Greg Kroah-Hartman
2023-11-24 17:55 ` [PATCH 5.4 142/159] netfilter: nf_tables: adapt set backend to use GC transaction API Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 143/159] netfilter: nft_set_hash: mark set element as dead when deleting from packet path Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 144/159] netfilter: nf_tables: remove busy mark and gc batch API Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 145/159] netfilter: nf_tables: fix GC transaction races with netns and netlink event exit path Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 146/159] netfilter: nf_tables: GC transaction race with netns dismantle Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 147/159] netfilter: nf_tables: GC transaction race with abort path Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 148/159] netfilter: nf_tables: use correct lock to protect gc_list Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 149/159] netfilter: nf_tables: defer gc run if previous batch is still pending Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 150/159] netfilter: nft_set_rbtree: skip sync GC for new elements in this transaction Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 151/159] netfilter: nft_set_rbtree: use read spinlock to avoid datapath contention Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 152/159] netfilter: nft_set_hash: try later when GC hits EAGAIN on iteration Greg Kroah-Hartman
2023-11-24 17:56 ` Greg Kroah-Hartman [this message]
2023-11-24 17:56 ` [PATCH 5.4 154/159] netfilter: nf_tables: unregister flowtable hooks on netns exit Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 155/159] netfilter: nf_tables: double hook unregistration in netns path Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 156/159] netfilter: nftables: update table flags from the commit phase Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 157/159] netfilter: nf_tables: fix table flag updates Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 158/159] netfilter: nf_tables: disable toggling dormant table state more than once Greg Kroah-Hartman
2023-11-24 17:56 ` [PATCH 5.4 159/159] netfilter: nf_tables: bogus EBUSY when deleting flowtable after flush (for 5.4) Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231124171948.158839044@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=fw@strlen.de \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=pablo@netfilter.org \
    --cc=patches@lists.linux.dev \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).