summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2026-02-26 08:58:16 +0000
committerFlorian Westphal <fw@strlen.de>2026-03-04 11:45:44 +0100
commitb297aaefc648be6bd6f3028f0b6161707c7bf632 (patch)
treefb1d0ba8f5eedd99d965f8adaf2edbbbfb60c516 /net
parentafc2125de7414be3a31f5c09724c0375a57f5eae (diff)
netfilter: nfnetlink_log: no longer acquire sk_callback_lock
After commit 983512f3a87f ("net: Drop the lock in skb_may_tx_timestamp()") from Sebastian Andrzej Siewior, apply the same logic in __build_packet_message() to avoid touching sk->sk_callback_lock. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'net')
-rw-r--r--net/netfilter/nfnetlink_log.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
index b35a90955e2e..730c2541a849 100644
--- a/net/netfilter/nfnetlink_log.c
+++ b/net/netfilter/nfnetlink_log.c
@@ -611,19 +611,26 @@ __build_packet_message(struct nfnl_log_net *log,
/* UID */
sk = skb->sk;
if (sk && sk_fullsock(sk)) {
- read_lock_bh(&sk->sk_callback_lock);
- if (sk->sk_socket && sk->sk_socket->file) {
- struct file *file = sk->sk_socket->file;
+ const struct socket *sock;
+ const struct file *file;
+
+ /* The sk pointer remains valid as long as the skb is.
+ * The sk_socket and file pointer may become NULL
+ * if the socket is closed.
+ * Both structures (including file->cred) are RCU freed
+ * which means they can be accessed within a RCU read section.
+ */
+ sock = READ_ONCE(sk->sk_socket);
+ file = sock ? READ_ONCE(sock->file) : NULL;
+ if (file) {
const struct cred *cred = file->f_cred;
struct user_namespace *user_ns = inst->peer_user_ns;
__be32 uid = htonl(from_kuid_munged(user_ns, cred->fsuid));
__be32 gid = htonl(from_kgid_munged(user_ns, cred->fsgid));
- read_unlock_bh(&sk->sk_callback_lock);
if (nla_put_be32(inst->skb, NFULA_UID, uid) ||
nla_put_be32(inst->skb, NFULA_GID, gid))
goto nla_put_failure;
- } else
- read_unlock_bh(&sk->sk_callback_lock);
+ }
}
/* local sequence number */