mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 18:43:33 +02:00
netfilter: nfnetlink_log: no longer acquire sk_callback_lock
After commit 983512f3a8 ("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>
This commit is contained in:
parent
afc2125de7
commit
b297aaefc6
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user