All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pablo Neira Ayuso <pablo@netfilter.org>
To: netfilter-devel@vger.kernel.org
Cc: davem@davemloft.net, netdev@vger.kernel.org, kuba@kernel.org,
	pabeni@redhat.com, edumazet@google.com, fw@strlen.de
Subject: [PATCH net 1/7] netfilter: nf_tables: Fix potential data-race in __nft_expr_type_get()
Date: Thu, 11 Apr 2024 13:28:54 +0200	[thread overview]
Message-ID: <20240411112900.129414-2-pablo@netfilter.org> (raw)
In-Reply-To: <20240411112900.129414-1-pablo@netfilter.org>

From: Ziyang Xuan <william.xuanziyang@huawei.com>

nft_unregister_expr() can concurrent with __nft_expr_type_get(),
and there is not any protection when iterate over nf_tables_expressions
list in __nft_expr_type_get(). Therefore, there is potential data-race
of nf_tables_expressions list entry.

Use list_for_each_entry_rcu() to iterate over nf_tables_expressions
list in __nft_expr_type_get(), and use rcu_read_lock() in the caller
nft_expr_type_get() to protect the entire type query process.

Fixes: ef1f7df9170d ("netfilter: nf_tables: expression ops overloading")
Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
 net/netfilter/nf_tables_api.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index d89d77946719..53b8c00863ad 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -3060,7 +3060,7 @@ static const struct nft_expr_type *__nft_expr_type_get(u8 family,
 {
 	const struct nft_expr_type *type, *candidate = NULL;
 
-	list_for_each_entry(type, &nf_tables_expressions, list) {
+	list_for_each_entry_rcu(type, &nf_tables_expressions, list) {
 		if (!nla_strcmp(nla, type->name)) {
 			if (!type->family && !candidate)
 				candidate = type;
@@ -3092,9 +3092,13 @@ static const struct nft_expr_type *nft_expr_type_get(struct net *net,
 	if (nla == NULL)
 		return ERR_PTR(-EINVAL);
 
+	rcu_read_lock();
 	type = __nft_expr_type_get(family, nla);
-	if (type != NULL && try_module_get(type->owner))
+	if (type != NULL && try_module_get(type->owner)) {
+		rcu_read_unlock();
 		return type;
+	}
+	rcu_read_unlock();
 
 	lockdep_nfnl_nft_mutex_not_held();
 #ifdef CONFIG_MODULES
-- 
2.30.2


  reply	other threads:[~2024-04-11 11:29 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-11 11:28 [PATCH net 0/7] Netfilter fixes for net Pablo Neira Ayuso
2024-04-11 11:28 ` Pablo Neira Ayuso [this message]
2024-04-12 12:10   ` [PATCH net 1/7] netfilter: nf_tables: Fix potential data-race in __nft_expr_type_get() patchwork-bot+netdevbpf
2024-04-11 11:28 ` [PATCH net 2/7] netfilter: nf_tables: Fix potential data-race in __nft_obj_type_get() Pablo Neira Ayuso
2024-04-11 11:28 ` [PATCH net 3/7] netfilter: br_netfilter: skip conntrack input hook for promisc packets Pablo Neira Ayuso
2024-04-11 11:28 ` [PATCH net 4/7] netfilter: nft_set_pipapo: walk over current view on netlink dump Pablo Neira Ayuso
2024-04-11 11:28 ` [PATCH net 5/7] netfilter: nft_set_pipapo: do not free live element Pablo Neira Ayuso
2024-04-11 11:28 ` [PATCH net 6/7] netfilter: flowtable: validate pppoe header Pablo Neira Ayuso
2024-04-11 11:29 ` [PATCH net 7/7] netfilter: flowtable: incorrect pppoe tuple Pablo Neira Ayuso
2024-04-11 11:39 ` [PATCH net 0/7] Netfilter fixes for net Paolo Abeni
2024-04-11 11:42   ` Pablo Neira Ayuso
2024-04-11 11:58     ` Paolo Abeni
2024-04-11 15:30       ` Pablo Neira Ayuso

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=20240411112900.129414-2-pablo@netfilter.org \
    --to=pablo@netfilter.org \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=fw@strlen.de \
    --cc=kuba@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=pabeni@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.