]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
af_unix: Cache state->msg in unix_stream_read_generic().
authorKuniyuki Iwashima <kuniyu@google.com>
Wed, 2 Jul 2025 22:35:17 +0000 (22:35 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 9 Jul 2025 01:05:25 +0000 (18:05 -0700)
In unix_stream_read_generic(), state->msg is fetched multiple times.

Let's cache it in a local variable.

Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20250702223606.1054680-6-kuniyu@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/unix/af_unix.c

index d9e604295a71f7f7957786e3d2ff0d46d06c29c8..c3dd41596d89790ffbc46d2b5ee45b7221a4cdfb 100644 (file)
@@ -2840,20 +2840,21 @@ static int unix_stream_read_skb(struct sock *sk, skb_read_actor_t recv_actor)
 static int unix_stream_read_generic(struct unix_stream_read_state *state,
                                    bool freezable)
 {
-       struct scm_cookie scm;
+       int noblock = state->flags & MSG_DONTWAIT;
        struct socket *sock = state->socket;
+       struct msghdr *msg = state->msg;
        struct sock *sk = sock->sk;
-       struct unix_sock *u = unix_sk(sk);
-       int copied = 0;
+       size_t size = state->size;
        int flags = state->flags;
-       int noblock = flags & MSG_DONTWAIT;
        bool check_creds = false;
-       int target;
+       struct scm_cookie scm;
+       unsigned int last_len;
+       struct unix_sock *u;
+       int copied = 0;
        int err = 0;
        long timeo;
+       int target;
        int skip;
-       size_t size = state->size;
-       unsigned int last_len;
 
        if (unlikely(READ_ONCE(sk->sk_state) != TCP_ESTABLISHED)) {
                err = -EINVAL;
@@ -2873,6 +2874,8 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state,
 
        memset(&scm, 0, sizeof(scm));
 
+       u = unix_sk(sk);
+
        /* Lock the socket to prevent queue disordering
         * while sleeps in memcpy_tomsg
         */
@@ -2964,14 +2967,12 @@ unlock:
                }
 
                /* Copy address just once */
-               if (state->msg && state->msg->msg_name) {
-                       DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr,
-                                        state->msg->msg_name);
-                       unix_copy_addr(state->msg, skb->sk);
+               if (msg && msg->msg_name) {
+                       DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name);
 
-                       BPF_CGROUP_RUN_PROG_UNIX_RECVMSG_LOCK(sk,
-                                                             state->msg->msg_name,
-                                                             &state->msg->msg_namelen);
+                       unix_copy_addr(msg, skb->sk);
+                       BPF_CGROUP_RUN_PROG_UNIX_RECVMSG_LOCK(sk, msg->msg_name,
+                                                             &msg->msg_namelen);
 
                        sunaddr = NULL;
                }
@@ -3033,8 +3034,8 @@ unlock:
        } while (size);
 
        mutex_unlock(&u->iolock);
-       if (state->msg)
-               scm_recv_unix(sock, state->msg, &scm, flags);
+       if (msg)
+               scm_recv_unix(sock, msg, &scm, flags);
        else
                scm_destroy(&scm);
 out: