Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Jul 2025 14:42:47 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: b435452e6b23 - main - sysctl net.inet.tcp.ktlslist: allow snd_tag_status_str() to sleep
Message-ID:  <202507101442.56AEgljV015036@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=b435452e6b2314e45131b6a3afaa1f4d674a7e17

commit b435452e6b2314e45131b6a3afaa1f4d674a7e17
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-07-03 10:37:35 +0000
Commit:     Konstantin Belousov <kib@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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202507101442.56AEgljV015036>