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

Reply via email to