Commit b297aaef authored by Eric Dumazet's avatar Eric Dumazet Committed by Florian Westphal
Browse files

netfilter: nfnetlink_log: no longer acquire sk_callback_lock



After commit 983512f3 ("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: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
parent afc2125d
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -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 */