git: d3acb974b48b - main - tcp: protect TCP over UDP configuration with a lock
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 26 Jan 2023 18:16:55 UTC
The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=d3acb974b48be37b552661715c4eb79d462aa6d1 commit d3acb974b48be37b552661715c4eb79d462aa6d1 Author: Gleb Smirnoff <glebius@FreeBSD.org> AuthorDate: 2023-01-26 18:16:32 +0000 Commit: Gleb Smirnoff <glebius@FreeBSD.org> CommitDate: 2023-01-26 18:16:32 +0000 tcp: protect TCP over UDP configuration with a lock The sysctl modifies global sockets without any locks. The removed comment suggests that previously it relied on a lock that doesn't exist today. --- sys/netinet/tcp_subr.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index 607abecfef97..9828529634bc 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -773,13 +773,14 @@ VNET_DEFINE(struct socket *, udp6_tun_socket) = NULL; #define V_udp6_tun_socket VNET(udp6_tun_socket) #endif +static struct sx tcpoudp_lock; + static void tcp_over_udp_stop(void) { - /* - * This function assumes sysctl caller holds inp_rinfo_lock() - * for writing! - */ + + sx_assert(&tcpoudp_lock, SA_XLOCKED); + #ifdef INET if (V_udp4_tun_socket != NULL) { soclose(V_udp4_tun_socket); @@ -805,10 +806,9 @@ tcp_over_udp_start(void) #ifdef INET6 struct sockaddr_in6 sin6; #endif - /* - * This function assumes sysctl caller holds inp_info_rlock() - * for writing! - */ + + sx_assert(&tcpoudp_lock, SA_XLOCKED); + port = V_tcp_udp_tunneling_port; if (ntohs(port) == 0) { /* Must have a port set */ @@ -896,6 +896,7 @@ sysctl_net_inet_tcp_udp_tunneling_port_check(SYSCTL_HANDLER_ARGS) (new > TCP_TUNNELING_PORT_MAX)) { error = EINVAL; } else { + sx_xlock(&tcpoudp_lock); V_tcp_udp_tunneling_port = new; if (old != 0) { tcp_over_udp_stop(); @@ -903,6 +904,7 @@ sysctl_net_inet_tcp_udp_tunneling_port_check(SYSCTL_HANDLER_ARGS) if (new != 0) { error = tcp_over_udp_start(); } + sx_xunlock(&tcpoudp_lock); } } return (error); @@ -1479,6 +1481,7 @@ tcp_init(void *arg __unused) TAILQ_INIT(&t_functions); rw_init(&tcp_function_lock, "tcp_func_lock"); register_tcp_functions(&tcp_def_funcblk, M_WAITOK); + sx_init(&tcpoudp_lock, "TCP over UDP configuration"); #ifdef TCP_BLACKBOX /* Initialize the TCP logging data. */ tcp_log_init();