diff options
author | Jakub Kicinski <kuba@kernel.org> | 2022-04-11 12:19:13 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2022-04-13 11:45:39 +0100 |
commit | 4dcdd971b9c7a5c38f65d81f7c548fea2e337373 (patch) | |
tree | 6ab29808cf019375f358cfde51393af83f0b4480 /net/tls/tls_sw.c | |
parent | 1c699ffa48a15710746989c36a82cbfb07e8d17f (diff) | |
download | lwn-4dcdd971b9c7a5c38f65d81f7c548fea2e337373.tar.gz lwn-4dcdd971b9c7a5c38f65d81f7c548fea2e337373.zip |
tls: rx: treat process_rx_list() errors as transient
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>
Diffstat (limited to 'net/tls/tls_sw.c')
-rw-r--r-- | net/tls/tls_sw.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index fd1a7ccc22bb..c1ba64bfe228 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -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; |