The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=b435452e6b2314e45131b6a3afaa1f4d674a7e17
commit b435452e6b2314e45131b6a3afaa1f4d674a7e17 Author: Konstantin Belousov <k...@freebsd.org> AuthorDate: 2025-07-03 10:37:35 +0000 Commit: Konstantin Belousov <k...@freebsd.org> CommitDate: 2025-07-10 14:42:27 +0000 sysctl net.inet.tcp.ktlslist: allow snd_tag_status_str() to sleep For this, unlock inp around the calls, taking the reference on it. If the inp appears to be freed or unlinked after the relock, return EDEADLK. Reviewed by: glebius, markj Sponsored by: Nvidia networking Differential revision: https://reviews.freebsd.org/D51143 --- sys/netinet/tcp_subr.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index cd42a67294a6..f8811649fe19 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -2720,8 +2720,12 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys) ksr->snd_tag->sw->snd_tag_status_str != NULL) { sz = SND_TAG_STATUS_MAXLEN; + in_pcbref(inp); + INP_RUNLOCK(inp); ksr->snd_tag->sw->snd_tag_status_str( ksr->snd_tag, NULL, &sz); + if (in_pcbrele_rlock(inp)) + return (EDEADLK); len += sz; } } @@ -2739,8 +2743,12 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys) kss->snd_tag->sw->snd_tag_status_str != NULL) { sz = SND_TAG_STATUS_MAXLEN; + in_pcbref(inp); + INP_RUNLOCK(inp); kss->snd_tag->sw->snd_tag_status_str( kss->snd_tag, NULL, &sz); + if (in_pcbrele_rlock(inp)) + return (EDEADLK); len += sz; } } @@ -2811,8 +2819,12 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys) if (ksr->snd_tag != NULL && ksr->snd_tag->sw->snd_tag_status_str != NULL) { sz = SND_TAG_STATUS_MAXLEN; + in_pcbref(inp); + INP_RUNLOCK(inp); ksr->snd_tag->sw->snd_tag_status_str( ksr->snd_tag, buf + len, &sz); + if (in_pcbrele_rlock(inp)) + return (EDEADLK); len += sz; } } @@ -2828,8 +2840,12 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys) if (kss->snd_tag != NULL && kss->snd_tag->sw->snd_tag_status_str != NULL) { sz = SND_TAG_STATUS_MAXLEN; + in_pcbref(inp); + INP_RUNLOCK(inp); kss->snd_tag->sw->snd_tag_status_str( kss->snd_tag, buf + len, &sz); + if (in_pcbrele_rlock(inp)) + return (EDEADLK); len += sz; } } @@ -2853,6 +2869,10 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys) zfree(buf, M_TEMP); return (error); + +again_reset: + req->oldidx = 0; + goto again; } static int