]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
netfilter: nfnetlink_log: no longer acquire sk_callback_lock
authorEric Dumazet <edumazet@google.com>
Thu, 26 Feb 2026 08:58:16 +0000 (08:58 +0000)
committerFlorian Westphal <fw@strlen.de>
Wed, 4 Mar 2026 10:45:44 +0000 (11:45 +0100)
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>
net/netfilter/nfnetlink_log.c

index b35a90955e2efe0c9841a75dfdfa5389ec1b1133..730c2541a8498e79f7a2e84352f09462063c021f 100644 (file)
@@ -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 */