Commit 11863c6d authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Jakub Kicinski
Browse files

net/tls: Use tcp_read_sock() instead of ops->read_sock()



TLS resets the protocol operations, so the read_sock() callback might
be changed, too.
In this case using sock->ops->readsock() in tls_strp_read_copyin() will
enter an infinite recursion if the read_sock() callback is calling
tls_rx_rec_wait() which will call into sock->ops->readsock() via
tls_strp_read_copyin().
But as tls_strp_read_copyin() is supposed to produce data from the
consumed socket and that socket is always a TCP socket we can call
tcp_read_sock() directly without having to deal with callbacks.

Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarJakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/r/20230726191556.41714-5-hare@suse.de


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 8790c6a4
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -369,7 +369,6 @@ static int tls_strp_copyin(read_descriptor_t *desc, struct sk_buff *in_skb,

static int tls_strp_read_copyin(struct tls_strparser *strp)
{
	struct socket *sock = strp->sk->sk_socket;
	read_descriptor_t desc;

	desc.arg.data = strp;
@@ -377,7 +376,7 @@ static int tls_strp_read_copyin(struct tls_strparser *strp)
	desc.count = 1; /* give more than one skb per call */

	/* sk should be locked here, so okay to do read_sock */
	sock->ops->read_sock(strp->sk, &desc, tls_strp_copyin);
	tcp_read_sock(strp->sk, &desc, tls_strp_copyin);

	return desc.error;
}