]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
af_unix: Set error only when needed in unix_dgram_sendmsg().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Fri, 13 Dec 2024 11:08:43 +0000 (20:08 +0900)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 17 Dec 2024 11:08:28 +0000 (12:08 +0100)
We will introduce skb drop reason for AF_UNIX, then we need to
set an errno and a drop reason for each path.

Let's set an error only when it's needed in unix_dgram_sendmsg().

Then, we need not (re)set 0 to err.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/unix/af_unix.c

index d30bcd50527e9b79cd4fbf3fbf04811e39857f45..07d6fba99a7c4fcd1f5ab678a415af5b0eb368ed 100644 (file)
@@ -1978,9 +1978,10 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
 
        wait_for_unix_gc(scm.fp);
 
-       err = -EOPNOTSUPP;
-       if (msg->msg_flags&MSG_OOB)
+       if (msg->msg_flags & MSG_OOB) {
+               err = -EOPNOTSUPP;
                goto out;
+       }
 
        if (msg->msg_namelen) {
                err = unix_validate_addr(sunaddr, msg->msg_namelen);
@@ -1995,10 +1996,11 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
                        goto out;
        } else {
                sunaddr = NULL;
-               err = -ENOTCONN;
                other = unix_peer_get(sk);
-               if (!other)
+               if (!other) {
+                       err = -ENOTCONN;
                        goto out;
+               }
        }
 
        if ((test_bit(SOCK_PASSCRED, &sock->flags) ||
@@ -2009,9 +2011,10 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
                        goto out;
        }
 
-       err = -EMSGSIZE;
-       if (len > READ_ONCE(sk->sk_sndbuf) - 32)
+       if (len > READ_ONCE(sk->sk_sndbuf) - 32) {
+               err = -EMSGSIZE;
                goto out;
+       }
 
        if (len > SKB_MAX_ALLOC) {
                data_len = min_t(size_t,
@@ -2043,9 +2046,10 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
 
 restart:
        if (!other) {
-               err = -ECONNRESET;
-               if (sunaddr == NULL)
+               if (!sunaddr) {
+                       err = -ECONNRESET;
                        goto out_free;
+               }
 
                other = unix_find_other(sock_net(sk), sunaddr, msg->msg_namelen,
                                        sk->sk_type);
@@ -2065,9 +2069,11 @@ restart:
        sk_locked = 0;
        unix_state_lock(other);
 restart_locked:
-       err = -EPERM;
-       if (!unix_may_send(sk, other))
+
+       if (!unix_may_send(sk, other)) {
+               err = -EPERM;
                goto out_unlock;
+       }
 
        if (unlikely(sock_flag(other, SOCK_DEAD))) {
                /*
@@ -2080,7 +2086,6 @@ restart_locked:
                if (!sk_locked)
                        unix_state_lock(sk);
 
-               err = 0;
                if (sk->sk_type == SOCK_SEQPACKET) {
                        /* We are here only when racing with unix_release_sock()
                         * is clearing @other. Never change state to TCP_CLOSE
@@ -2108,9 +2113,10 @@ restart_locked:
                goto restart;
        }
 
-       err = -EPIPE;
-       if (other->sk_shutdown & RCV_SHUTDOWN)
+       if (other->sk_shutdown & RCV_SHUTDOWN) {
+               err = -EPIPE;
                goto out_unlock;
+       }
 
        if (sk->sk_type != SOCK_SEQPACKET) {
                err = security_unix_may_send(sk->sk_socket, other->sk_socket);