Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net/tls: Fix inverted error codes to avoid endless loop

sendfile() calls can hang endless with using Kernel TLS if a socket error occurs.
Socket error codes must be inverted by Kernel TLS before returning because
they are stored with positive sign. If returned non-inverted they are
interpreted as number of bytes sent, causing endless looping of the
splice mechanic behind sendfile().

Signed-off-by: Robert Hering <r.hering@avm.de>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

r.hering@avm.de and committed by
David S. Miller
30be8f8d 95ef498d

+3 -3
+1 -1
include/net/tls.h
··· 170 170 171 171 static inline void tls_err_abort(struct sock *sk) 172 172 { 173 - sk->sk_err = -EBADMSG; 173 + sk->sk_err = EBADMSG; 174 174 sk->sk_error_report(sk); 175 175 } 176 176
+2 -2
net/tls/tls_sw.c
··· 391 391 392 392 while (msg_data_left(msg)) { 393 393 if (sk->sk_err) { 394 - ret = sk->sk_err; 394 + ret = -sk->sk_err; 395 395 goto send_end; 396 396 } 397 397 ··· 544 544 size_t copy, required_size; 545 545 546 546 if (sk->sk_err) { 547 - ret = sk->sk_err; 547 + ret = -sk->sk_err; 548 548 goto sendpage_end; 549 549 } 550 550