Preserve the error code returned by sock_cmsg_send and return that on
err.

Signed-off-by: Mina Almasry <almasrym...@google.com>

---

v2:
- Remove unnecessary !! (Stan)
---
 net/ipv4/tcp.c | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)

diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index b7b6ab41b496..f64f8276a73c 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -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;
        }
 
-- 
2.49.0.1151.ga128411c76-goog


Reply via email to