From: Alexander Bluhm Subject: tcp debug mutex To: tech@openbsd.org Date: Wed, 10 Apr 2024 21:05:50 +0200 Hi, Protect the global variables in TCP debug code with global mutex. Add a missing include and also fix the -Wunused-but-set-variable warning. ok? bluhm Index: netinet/tcp_debug.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_debug.c,v diff -u -p -r1.31 tcp_debug.c --- netinet/tcp_debug.c 11 Jan 2024 13:49:49 -0000 1.31 +++ netinet/tcp_debug.c 10 Apr 2024 18:53:38 -0000 @@ -79,6 +79,7 @@ #include #include #include +#include #include #include @@ -99,20 +100,32 @@ #endif /* INET6 */ #ifdef TCPDEBUG +#include +#endif + +/* + * Locks used to protect struct members in this file: + * D TCP debug global mutex + */ + +struct mutex tcp_debug_mtx = MUTEX_INITIALIZER(IPL_SOFTNET); + +#ifdef TCPDEBUG int tcpconsdebug = 0; #endif -struct tcp_debug tcp_debug[TCP_NDEBUG]; -int tcp_debx; +struct tcp_debug tcp_debug[TCP_NDEBUG]; /* [D] */ +int tcp_debx; /* [D] */ /* * Tcp debug routines */ void -tcp_trace(short act, short ostate, struct tcpcb *tp, struct tcpcb *otp, +tcp_trace_locked(short act, short ostate, struct tcpcb *tp, struct tcpcb *otp, caddr_t headers, int req, int len) { #ifdef TCPDEBUG + struct tcphdr *th; tcp_seq seq, ack; int flags; #endif @@ -120,7 +133,6 @@ tcp_trace(short act, short ostate, struc struct tcp_debug *td = &tcp_debug[tcp_debx++]; struct tcpiphdr *ti = (struct tcpiphdr *)headers; struct tcpipv6hdr *ti6 = (struct tcpipv6hdr *)headers; - struct tcphdr *th; if (tcp_debx == TCP_NDEBUG) tcp_debx = 0; @@ -153,13 +165,17 @@ tcp_trace(short act, short ostate, struc switch (pf) { #ifdef INET6 case PF_INET6: +#ifdef TCPDEBUG th = &ti6->ti6_t; +#endif td->td_ti6 = *ti6; td->td_ti6.ti6_plen = len; break; #endif /* INET6 */ case PF_INET: +#ifdef TCPDEBUG th = &ti->ti_t; +#endif td->td_ti = *ti; td->td_ti.ti_len = len; break; @@ -225,4 +241,13 @@ tcp_trace(short act, short ostate, struc printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%lx)\n", tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); #endif /* TCPDEBUG */ +} + +void +tcp_trace(short act, short ostate, struct tcpcb *tp, struct tcpcb *otp, + caddr_t headers, int req, int len) +{ + mtx_enter(&tcp_debug_mtx); + tcp_trace_locked(act, ostate, tp, otp, headers, req, len); + mtx_leave(&tcp_debug_mtx); }