]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: devmem: preserve sockc_err
authorMina Almasry <almasrymina@google.com>
Fri, 23 May 2025 23:05:19 +0000 (23:05 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 28 May 2025 02:19:35 +0000 (19:19 -0700)
Preserve the error code returned by sock_cmsg_send and return that on
err.

Signed-off-by: Mina Almasry <almasrymina@google.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20250523230524.1107879-4-almasrymina@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/tcp.c

index b7b6ab41b496f98bf82e099fab1da454dce1fe67..f64f8276a73cdd14aafc4e9e16ae4267e24f1242 100644 (file)
@@ -1067,7 +1067,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
        int flags, err, copied = 0;
        int mss_now = 0, size_goal, copied_syn = 0;
        int process_backlog = 0;
-       bool sockc_valid = true;
+       int sockc_err = 0;
        int zc = 0;
        long timeo;
 
@@ -1075,13 +1075,10 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
 
        sockc = (struct sockcm_cookie){ .tsflags = READ_ONCE(sk->sk_tsflags) };
        if (msg->msg_controllen) {
-               err = sock_cmsg_send(sk, msg, &sockc);
-               if (unlikely(err))
-                       /* Don't return error until MSG_FASTOPEN has been
-                        * processed; that may succeed even if the cmsg is
-                        * invalid.
-                        */
-                       sockc_valid = false;
+               sockc_err = sock_cmsg_send(sk, msg, &sockc);
+               /* Don't return error until MSG_FASTOPEN has been processed;
+                * that may succeed even if the cmsg is invalid.
+                */
        }
 
        if ((flags & MSG_ZEROCOPY) && size) {
@@ -1092,7 +1089,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
                } else if (sock_flag(sk, SOCK_ZEROCOPY)) {
                        skb = tcp_write_queue_tail(sk);
                        uarg = msg_zerocopy_realloc(sk, size, skb_zcopy(skb),
-                                                   sockc_valid && !!sockc.dmabuf_id);
+                                                   !sockc_err && sockc.dmabuf_id);
                        if (!uarg) {
                                err = -ENOBUFS;
                                goto out_err;
@@ -1102,7 +1099,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
                        else
                                uarg_to_msgzc(uarg)->zerocopy = 0;
 
-                       if (sockc_valid && sockc.dmabuf_id) {
+                       if (!sockc_err && sockc.dmabuf_id) {
                                binding = net_devmem_get_binding(sk, sockc.dmabuf_id);
                                if (IS_ERR(binding)) {
                                        err = PTR_ERR(binding);
@@ -1116,7 +1113,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
                        zc = MSG_SPLICE_PAGES;
        }
 
-       if (sockc_valid && sockc.dmabuf_id &&
+       if (!sockc_err && sockc.dmabuf_id &&
            (!(flags & MSG_ZEROCOPY) || !sock_flag(sk, SOCK_ZEROCOPY))) {
                err = -EINVAL;
                goto out_err;
@@ -1160,9 +1157,8 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
                /* 'common' sending to sendq */
        }
 
-       if (!sockc_valid) {
-               if (!err)
-                       err = -EINVAL;
+       if (sockc_err) {
+               err = sockc_err;
                goto out_err;
        }