]>
Commit | Line | Data |
---|---|---|
ffc20820 GKH |
1 | From foo@baz Fri 31 May 2019 03:16:39 PM PDT |
2 | From: Jakub Kicinski <jakub.kicinski@netronome.com> | |
3 | Date: Fri, 24 May 2019 10:34:30 -0700 | |
4 | Subject: net/tls: fix lowat calculation if some data came from previous record | |
5 | ||
6 | From: Jakub Kicinski <jakub.kicinski@netronome.com> | |
7 | ||
8 | [ Upstream commit 46a1695960d0600d58da7af33c65f24f3d839674 ] | |
9 | ||
10 | If some of the data came from the previous record, i.e. from | |
11 | the rx_list it had already been decrypted, so it's not counted | |
12 | towards the "decrypted" variable, but the "copied" variable. | |
13 | Take that into account when checking lowat. | |
14 | ||
15 | When calculating lowat target we need to pass the original len. | |
16 | E.g. if lowat is at 80, len is 100 and we had 30 bytes on rx_list | |
17 | target would currently be incorrectly calculated as 70, even though | |
18 | we only need 50 more bytes to make up the 80. | |
19 | ||
20 | Fixes: 692d7b5d1f91 ("tls: Fix recvmsg() to be able to peek across multiple records") | |
21 | Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> | |
22 | Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com> | |
23 | Tested-by: David Beckett <david.beckett@netronome.com> | |
24 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
25 | Signed-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 |