mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
af_unix: rework unix_maybe_add_creds() to allow sleep
As a preparation for the next patches we need to allow sleeping in unix_maybe_add_creds() and also return err. Currently, we can't do that as unix_maybe_add_creds() is being called under unix_state_lock(). There is no need for this, really. So let's move call sites of this helper a bit and do necessary function signature changes. Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: David S. Miller <davem@davemloft.net> Cc: Eric Dumazet <edumazet@google.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Paolo Abeni <pabeni@redhat.com> Cc: Simon Horman <horms@kernel.org> Cc: Leon Romanovsky <leon@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Christian Brauner <brauner@kernel.org> Cc: Kuniyuki Iwashima <kuniyu@google.com> Cc: Lennart Poettering <mzxreary@0pointer.de> Cc: Luca Boccassi <bluca@debian.org> Cc: David Rheinsberg <david@readahead.eu> Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com> Link: https://lore.kernel.org/20250703222314.309967-2-aleksandr.mikhalitsyn@canonical.com Reviewed-by: Christian Brauner <brauner@kernel.org> Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
committed by
Christian Brauner
parent
867673063e
commit
9bedee7cdf
@@ -1955,21 +1955,30 @@ static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool sen
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* unix_maybe_add_creds() - Adds current task uid/gid and struct pid to skb if needed.
|
||||
* @skb: skb to attach creds to.
|
||||
* @sk: Sender sock.
|
||||
* @other: Receiver sock.
|
||||
*
|
||||
* Some apps rely on write() giving SCM_CREDENTIALS
|
||||
* We include credentials if source or destination socket
|
||||
* asserted SOCK_PASSCRED.
|
||||
*
|
||||
* Return: On success zero, on error a negative error code is returned.
|
||||
*/
|
||||
static void unix_maybe_add_creds(struct sk_buff *skb, const struct sock *sk,
|
||||
const struct sock *other)
|
||||
static int unix_maybe_add_creds(struct sk_buff *skb, const struct sock *sk,
|
||||
const struct sock *other)
|
||||
{
|
||||
if (UNIXCB(skb).pid)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (unix_may_passcred(sk) || unix_may_passcred(other)) {
|
||||
UNIXCB(skb).pid = get_pid(task_tgid(current));
|
||||
current_uid_gid(&UNIXCB(skb).uid, &UNIXCB(skb).gid);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool unix_skb_scm_eq(struct sk_buff *skb,
|
||||
@@ -2104,6 +2113,10 @@ lookup:
|
||||
goto out_sock_put;
|
||||
}
|
||||
|
||||
err = unix_maybe_add_creds(skb, sk, other);
|
||||
if (err)
|
||||
goto out_sock_put;
|
||||
|
||||
restart:
|
||||
sk_locked = 0;
|
||||
unix_state_lock(other);
|
||||
@@ -2212,7 +2225,6 @@ restart_locked:
|
||||
if (sock_flag(other, SOCK_RCVTSTAMP))
|
||||
__net_timestamp(skb);
|
||||
|
||||
unix_maybe_add_creds(skb, sk, other);
|
||||
scm_stat_add(other, skb);
|
||||
skb_queue_tail(&other->sk_receive_queue, skb);
|
||||
unix_state_unlock(other);
|
||||
@@ -2256,6 +2268,10 @@ static int queue_oob(struct sock *sk, struct msghdr *msg, struct sock *other,
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
err = unix_maybe_add_creds(skb, sk, other);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
skb_put(skb, 1);
|
||||
err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, 1);
|
||||
|
||||
@@ -2275,7 +2291,6 @@ static int queue_oob(struct sock *sk, struct msghdr *msg, struct sock *other,
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
unix_maybe_add_creds(skb, sk, other);
|
||||
scm_stat_add(other, skb);
|
||||
|
||||
spin_lock(&other->sk_receive_queue.lock);
|
||||
@@ -2369,6 +2384,10 @@ static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
|
||||
fds_sent = true;
|
||||
|
||||
err = unix_maybe_add_creds(skb, sk, other);
|
||||
if (err)
|
||||
goto out_free;
|
||||
|
||||
if (unlikely(msg->msg_flags & MSG_SPLICE_PAGES)) {
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
err = skb_splice_from_iter(skb, &msg->msg_iter, size,
|
||||
@@ -2399,7 +2418,6 @@ static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
unix_maybe_add_creds(skb, sk, other);
|
||||
scm_stat_add(other, skb);
|
||||
skb_queue_tail(&other->sk_receive_queue, skb);
|
||||
unix_state_unlock(other);
|
||||
|
||||
Reference in New Issue
Block a user