The branch main has been updated by kib:

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

commit d7c807aa884d178e9bd17afe7adaccb22b3b0dc3
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2025-07-09 01:41:16 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2025-07-10 14:42:27 +0000

    sysctl net.inet.tcp.ktcplist: properly fill driver status length field
    
    Also ignore errors from drivers. If driver snd_tag status method
    returned an error, silently ignore the returned string, and not advance
    the position of the filled buffer.
    
    Sponsored by:   Nvidia networking
---
 sys/netinet/tcp_subr.c | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 45048fb3848d..db415f6bdf03 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -2722,11 +2722,13 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool 
export_keys)
                                        sz = SND_TAG_STATUS_MAXLEN;
                                        in_pcbref(inp);
                                        INP_RUNLOCK(inp);
-                                       ksr->snd_tag->sw->snd_tag_status_str(
+                                       error = ksr->snd_tag->sw->
+                                           snd_tag_status_str(
                                            ksr->snd_tag, NULL, &sz);
                                        if (in_pcbrele_rlock(inp))
                                                return (EDEADLK);
-                                       len += sz;
+                                       if (error == 0)
+                                               len += sz;
                                }
                        }
                        kss = so->so_snd.sb_tls_info;
@@ -2745,11 +2747,13 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool 
export_keys)
                                        sz = SND_TAG_STATUS_MAXLEN;
                                        in_pcbref(inp);
                                        INP_RUNLOCK(inp);
-                                       kss->snd_tag->sw->snd_tag_status_str(
+                                       error = kss->snd_tag->sw->
+                                           snd_tag_status_str(
                                            kss->snd_tag, NULL, &sz);
                                        if (in_pcbrele_rlock(inp))
                                                return (EDEADLK);
-                                       len += sz;
+                                       if (error == 0)
+                                               len += sz;
                                }
                        }
                        if (p) {
@@ -2821,11 +2825,14 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool 
export_keys)
                                sz = SND_TAG_STATUS_MAXLEN;
                                in_pcbref(inp);
                                INP_RUNLOCK(inp);
-                               ksr->snd_tag->sw->snd_tag_status_str(
+                               error = ksr->snd_tag->sw->snd_tag_status_str(
                                    ksr->snd_tag, buf + len, &sz);
                                if (in_pcbrele_rlock(inp))
                                        return (EDEADLK);
-                               len += sz;
+                               if (error == 0) {
+                                       xktls->rcv.drv_st_len = sz;
+                                       len += sz;
+                               }
                        }
                }
                if (kss != NULL && kss->gen == xig.xig_gen) {
@@ -2842,11 +2849,14 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool 
export_keys)
                                sz = SND_TAG_STATUS_MAXLEN;
                                in_pcbref(inp);
                                INP_RUNLOCK(inp);
-                               kss->snd_tag->sw->snd_tag_status_str(
+                               error = kss->snd_tag->sw->snd_tag_status_str(
                                    kss->snd_tag, buf + len, &sz);
                                if (in_pcbrele_rlock(inp))
                                        return (EDEADLK);
-                               len += sz;
+                               if (error == 0) {
+                                       xktls->snd.drv_st_len = sz;
+                                       len += sz;
+                               }
                        }
                }
                len = roundup2(len, __alignof(*xktls));

Reply via email to