tls: rx: treat process_rx_list() errors as transient
authorJakub Kicinski <kuba@kernel.org>
Mon, 11 Apr 2022 19:19:13 +0000 (12:19 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 Apr 2022 10:45:39 +0000 (11:45 +0100)
process_rx_list() only fails if it can't copy data to user
space. There is no point recording the error onto sk->sk_err
or giving up on the data which was read partially. Treat
the return value like a normal socket partial read.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tls/tls_sw.c

index fd1a7ccc22bb72f02d1ddd15760f60318c69086a..c1ba64bfe228d2d779b5dedc38ced2f8db6e9409 100644 (file)
@@ -1650,7 +1650,7 @@ static int process_rx_list(struct tls_sw_context_rx *ctx,
 
                err = tls_record_content_type(msg, tlm, control);
                if (err <= 0)
-                       return err;
+                       goto out;
 
                if (skip < rxm->full_len)
                        break;
@@ -1668,13 +1668,13 @@ static int process_rx_list(struct tls_sw_context_rx *ctx,
 
                err = tls_record_content_type(msg, tlm, control);
                if (err <= 0)
-                       return err;
+                       goto out;
 
                if (!zc || (rxm->full_len - skip) > len) {
                        err = skb_copy_datagram_msg(skb, rxm->offset + skip,
                                                    msg, chunk);
                        if (err < 0)
-                               return err;
+                               goto out;
                }
 
                len = len - chunk;
@@ -1707,8 +1707,10 @@ static int process_rx_list(struct tls_sw_context_rx *ctx,
 
                skb = next_skb;
        }
+       err = 0;
 
-       return copied;
+out:
+       return copied ? : err;
 }
 
 int tls_sw_recvmsg(struct sock *sk,
@@ -1744,10 +1746,8 @@ int tls_sw_recvmsg(struct sock *sk,
 
        /* Process pending decrypted records. It must be non-zero-copy */
        err = process_rx_list(ctx, msg, &control, 0, len, false, is_peek);
-       if (err < 0) {
-               tls_err_abort(sk, err);
+       if (err < 0)
                goto end;
-       }
 
        copied = err;
        if (len <= copied)
@@ -1899,11 +1899,7 @@ recv_end:
                else
                        err = process_rx_list(ctx, msg, &control, 0,
                                              decrypted, true, is_peek);
-               if (err < 0) {
-                       tls_err_abort(sk, err);
-                       copied = 0;
-                       goto end;
-               }
+               decrypted = max(err, 0);
        }
 
        copied += decrypted;