]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/5.1.7/net-tls-fix-lowat-calculation-if-some-data-came-from-previous-record.patch
Linux 5.1.7
[thirdparty/kernel/stable-queue.git] / releases / 5.1.7 / net-tls-fix-lowat-calculation-if-some-data-came-from-previous-record.patch
CommitLineData
ffc20820
GKH
1From foo@baz Fri 31 May 2019 03:16:39 PM PDT
2From: Jakub Kicinski <jakub.kicinski@netronome.com>
3Date: Fri, 24 May 2019 10:34:30 -0700
4Subject: net/tls: fix lowat calculation if some data came from previous record
5
6From: Jakub Kicinski <jakub.kicinski@netronome.com>
7
8[ Upstream commit 46a1695960d0600d58da7af33c65f24f3d839674 ]
9
10If some of the data came from the previous record, i.e. from
11the rx_list it had already been decrypted, so it's not counted
12towards the "decrypted" variable, but the "copied" variable.
13Take that into account when checking lowat.
14
15When calculating lowat target we need to pass the original len.
16E.g. if lowat is at 80, len is 100 and we had 30 bytes on rx_list
17target would currently be incorrectly calculated as 70, even though
18we only need 50 more bytes to make up the 80.
19
20Fixes: 692d7b5d1f91 ("tls: Fix recvmsg() to be able to peek across multiple records")
21Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
22Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
23Tested-by: David Beckett <david.beckett@netronome.com>
24Signed-off-by: David S. Miller <davem@davemloft.net>
25Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
26---
27 net/tls/tls_sw.c | 13 ++++++-------
28 1 file changed, 6 insertions(+), 7 deletions(-)
29
30--- a/net/tls/tls_sw.c
31+++ b/net/tls/tls_sw.c
32@@ -1685,13 +1685,12 @@ int tls_sw_recvmsg(struct sock *sk,
33 copied = err;
34 }
35
36- len = len - copied;
37- if (len) {
38- target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
39- timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
40- } else {
41+ if (len <= copied)
42 goto recv_end;
43- }
44+
45+ target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
46+ len = len - copied;
47+ timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
48
49 do {
50 bool retain_skb = false;
51@@ -1826,7 +1825,7 @@ pick_next_record:
52 }
53
54 /* If we have a new message from strparser, continue now. */
55- if (decrypted >= target && !ctx->recv_pkt)
56+ if (decrypted + copied >= target && !ctx->recv_pkt)
57 break;
58 } while (len);
59