git: d7c807aa884d - main - sysctl net.inet.tcp.ktcplist: properly fill driver status length field

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Thu, 10 Jul 2025 14:42:49 UTC
The branch main has been updated by kib:

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

commit d7c807aa884d178e9bd17afe7adaccb22b3b0dc3
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-07-09 01:41:16 +0000
Commit:     Konstantin Belousov <kib@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));