[SRU D 1/3] net/tls: fix lowat calculation if some data came from previous record
Thadeu Lima de Souza Cascardo
cascardo at canonical.com
Wed Jul 22 19:34:00 UTC 2020
From: Jakub Kicinski <jakub.kicinski at netronome.com>
BugLink: https://bugs.launchpad.net/bugs/1888381
If some of the data came from the previous record, i.e. from
the rx_list it had already been decrypted, so it's not counted
towards the "decrypted" variable, but the "copied" variable.
Take that into account when checking lowat.
When calculating lowat target we need to pass the original len.
E.g. if lowat is at 80, len is 100 and we had 30 bytes on rx_list
target would currently be incorrectly calculated as 70, even though
we only need 50 more bytes to make up the 80.
Fixes: 692d7b5d1f91 ("tls: Fix recvmsg() to be able to peek across multiple records")
Signed-off-by: Jakub Kicinski <jakub.kicinski at netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe at netronome.com>
Tested-by: David Beckett <david.beckett at netronome.com>
Signed-off-by: David S. Miller <davem at davemloft.net>
(cherry picked from commit 46a1695960d0600d58da7af33c65f24f3d839674)
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo at canonical.com>
---
net/tls/tls_sw.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
index e903b9f85108..b800e8b500e8 100644
--- a/net/tls/tls_sw.c
+++ b/net/tls/tls_sw.c
@@ -1603,13 +1603,12 @@ int tls_sw_recvmsg(struct sock *sk,
copied = err;
}
- len = len - copied;
- if (len) {
- target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
- timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
- } else {
+ if (len <= copied)
goto recv_end;
- }
+
+ target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
+ len = len - copied;
+ timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
do {
bool retain_skb = false;
@@ -1715,7 +1714,7 @@ int tls_sw_recvmsg(struct sock *sk,
}
/* If we have a new message from strparser, continue now. */
- if (decrypted >= target && !ctx->recv_pkt)
+ if (decrypted + copied >= target && !ctx->recv_pkt)
break;
} while (len);
--
2.25.1
More information about the kernel-team
mailing list