From: "Ömer Mete Kaya" <omermetekaya0@gmail.com>
To: steffen.klassert@secunet.com, herbert@gondor.apana.org.au
Cc: "Ömer Mete Kaya" <omermetekaya0@gmail.com>,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, horms@kernel.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org,
syzbot+d3bc2f2eb498a0175940@syzkaller.appspotmail.com
Subject: [PATCH v2] xfrm: fix suspicious RCU usage in xfrm_nlmsg_multicast
Date: Tue, 18 Aug 2026 14:20:24 +0300 [thread overview]
Message-ID: <20260818112038.56788-1-omermetekaya0@gmail.com> (raw)
In-Reply-To: <aoLLSiD7yjcaH_BI@secunet.com>
xfrm_nlmsg_multicast() dereferences net->xfrm.nlsk via
rcu_dereference() and is documented as requiring the RCU read
lock, but 11 of its 12 call sites in this file do not hold it.
Move the RCU read-side critical section inside
xfrm_nlmsg_multicast() itself instead of adding it to each call
site individually. This is safe: xfrm_get_translator() takes its
own nested RCU read lock internally, and nlmsg_multicast() is
called with GFP_ATOMIC, whose only conditional yield() in
netlink_broadcast_filtered() is gated on blocking being allowed,
which GFP_ATOMIC never permits.
The redundant rcu_read_lock()/rcu_read_unlock() pair in
xfrm_notify_userpolicy(), the one caller that already took the
lock, is removed accordingly.
Reported-by: syzbot+d3bc2f2eb498a0175940@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=d3bc2f2eb498a0175940
Fixes: 21ee543edc0d ("xfrm: fix race between netns cleanup and state expire notification")
Signed-off-by: Ömer Mete Kaya <omermetekaya0@gmail.com>
---
v2: Added Fixes: tag pointing to the commit that introduced
xfrm_nlmsg_multicast() and its RCU-locking contract, as requested
by Steffen.
net/xfrm/xfrm_user.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index d6db63304..1f683516f 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -1622,31 +1622,35 @@ static struct sk_buff *xfrm_state_netlink(struct sk_buff *in_skb,
}
/* A wrapper for nlmsg_multicast() checking that nlsk is still available.
- * Must be called with RCU read lock.
+ * Takes the RCU read lock internally around the multicast.
*/
static inline int xfrm_nlmsg_multicast(struct net *net, struct sk_buff *skb,
- u32 pid, unsigned int group)
+ u32 pid, unsigned int group)
{
- struct sock *nlsk = rcu_dereference(net->xfrm.nlsk);
+ struct sock *nlsk;
struct xfrm_translator *xtr;
+ int err;
+ rcu_read_lock();
+ nlsk = rcu_dereference(net->xfrm.nlsk);
if (!nlsk) {
+ rcu_read_unlock();
kfree_skb(skb);
return -EPIPE;
}
-
xtr = xfrm_get_translator();
if (xtr) {
- int err = xtr->alloc_compat(skb, nlmsg_hdr(skb));
-
+ err = xtr->alloc_compat(skb, nlmsg_hdr(skb));
xfrm_put_translator(xtr);
if (err) {
+ rcu_read_unlock();
kfree_skb(skb);
return err;
}
}
-
- return nlmsg_multicast(nlsk, skb, pid, group, GFP_ATOMIC);
+ err = nlmsg_multicast(nlsk, skb, pid, group, GFP_ATOMIC);
+ rcu_read_unlock();
+ return err;
}
static inline unsigned int xfrm_spdinfo_msgsize(void)
@@ -2536,9 +2540,7 @@ static int xfrm_notify_userpolicy(struct net *net)
nlmsg_end(skb, nlh);
- rcu_read_lock();
err = xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_POLICY);
- rcu_read_unlock();
return err;
}
--
2.55.0
prev parent reply other threads:[~2026-08-18 11:21 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-03 17:05 [PATCH] xfrm: fix suspicious RCU usage in xfrm_nlmsg_multicast Ömer Mete Kaya
2026-08-17 8:50 ` Steffen Klassert
2026-08-18 11:20 ` Ömer Mete Kaya [this message]
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=20260818112038.56788-1-omermetekaya0@gmail.com \
--to=omermetekaya0@gmail.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=herbert@gondor.apana.org.au \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=steffen.klassert@secunet.com \
--cc=syzbot+d3bc2f2eb498a0175940@syzkaller.appspotmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox