diff options
author | Sabrina Dubroca <sd@queasysnail.net> | 2024-02-15 17:17:30 +0100 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2024-02-21 14:25:51 -0800 |
commit | fdfbaec5923d9359698cbb286bc0deadbb717504 (patch) | |
tree | e295f0da68118f8ebd68369ea02d9a17ff4fecfa | |
parent | 10f41d0710fc81b7af93fa6106678d57b1ff24a7 (diff) | |
download | linux-fdfbaec5923d9359698cbb286bc0deadbb717504.tar.gz |
tls: stop recv() if initial process_rx_list gave us non-DATA
If we have a non-DATA record on the rx_list and another record of the
same type still on the queue, we will end up merging them:
- process_rx_list copies the non-DATA record
- we start the loop and process the first available record since it's
of the same type
- we break out of the loop since the record was not DATA
Just check the record type and jump to the end in case process_rx_list
did some work.
Fixes: 692d7b5d1f91 ("tls: Fix recvmsg() to be able to peek across multiple records")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Link: https://lore.kernel.org/r/bd31449e43bd4b6ff546f5c51cf958c31c511deb.1708007371.git.sd@queasysnail.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Notes
Fixes: 692d7b5d1f91 ("tls: Fix recvmsg() to be able to peek across multiple records") # v5.1-rc1
Stable: 3b952d8fdfcf # v6.6.19
Stable: 6756168add1c # v6.1.80
Stable: 4338032aa90b # v5.15.150
Stable: 31e10d6cb0c9 # v5.10.211
Stable: f310143961e2 # v5.4.270
Lore: https://lore.kernel.org/r/20240227131555.442695028@linuxfoundation.org # linux-patches, stable
Lore: https://lore.kernel.org/r/20240227131602.433947198@linuxfoundation.org # linux-patches, stable
Lore: https://lore.kernel.org/r/20240227131615.924910161@linuxfoundation.org # linux-patches, stable
Lore: https://lore.kernel.org/r/20240227131622.658412194@linuxfoundation.org # linux-patches, stable
Lore: https://lore.kernel.org/r/20240227131634.341203243@linuxfoundation.org # linux-patches, stable
Lore: https://lore.kernel.org/r/20240227131640.864842832@linuxfoundation.org # linux-patches, stable
Lore: https://lore.kernel.org/r/bd31449e43bd4b6ff546f5c51cf958c31c511deb.1708007371.git.sd@queasysnail.net # linux-kselftest, netdev
-rw-r--r-- | net/tls/tls_sw.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 78aedfc682ba8..43dd0d82b6ed7 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1971,7 +1971,7 @@ int tls_sw_recvmsg(struct sock *sk, goto end; copied = err; - if (len <= copied) + if (len <= copied || (copied && control != TLS_RECORD_TYPE_DATA)) goto end; target = sock_rcvlowat(sk, flags & MSG_WAITALL, len); |