Message ID | 1b5a1eaab3c088a9dd5d9f1059ceecd7afe888d1.1711120964.git.sd@queasysnail.net (mailing list archive) |
---|---|
State | Accepted |
Commit | 85eef9a41d019b59be7bc91793f26251909c0710 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | tls: recvmsg fixes | expand |
On Mon, Mar 25, 2024 at 04:56:46PM +0100, Sabrina Dubroca wrote: > process_rx_list may not copy as many bytes as we want to the userspace > buffer, for example in case we hit an EFAULT during the copy. If this > happens, we should only count the bytes that were actually copied, > which may be 0. > > Subtracting async_copy_bytes is correct in both peek and !peek cases, > because decrypted == async_copy_bytes + peeked for the peek case: peek > is always !ZC, and we can go through either the sync or async path. In > the async case, we add chunk to both decrypted and > async_copy_bytes. In the sync case, we add chunk to both decrypted and > peeked. I missed that in commit 6caaf104423d ("tls: fix peeking with > sync+async decryption"). > > Fixes: 4d42cd6bc2ac ("tls: rx: fix return value for async crypto") > Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Reviewed-by: Simon Horman <horms@kernel.org>
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 3cdc6bc9fba6..14faf6189eb1 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -2158,6 +2158,9 @@ int tls_sw_recvmsg(struct sock *sk, else err = process_rx_list(ctx, msg, &control, 0, async_copy_bytes, is_peek, NULL); + + /* we could have copied less than we wanted, and possibly nothing */ + decrypted += max(err, 0) - async_copy_bytes; } copied += decrypted;
process_rx_list may not copy as many bytes as we want to the userspace buffer, for example in case we hit an EFAULT during the copy. If this happens, we should only count the bytes that were actually copied, which may be 0. Subtracting async_copy_bytes is correct in both peek and !peek cases, because decrypted == async_copy_bytes + peeked for the peek case: peek is always !ZC, and we can go through either the sync or async path. In the async case, we add chunk to both decrypted and async_copy_bytes. In the sync case, we add chunk to both decrypted and peeked. I missed that in commit 6caaf104423d ("tls: fix peeking with sync+async decryption"). Fixes: 4d42cd6bc2ac ("tls: rx: fix return value for async crypto") Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> --- I'll send a patch removing the peeked variable and simplifying the process_rx_list call for net-next after this series lands there net/tls/tls_sw.c | 3 +++ 1 file changed, 3 insertions(+)