git: 40484d3117d9 - main - ctld: Use freebsd::fd_up to manage the lifecycle of accepted sockets

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Wed, 06 Aug 2025 20:10:01 UTC
The branch main has been updated by jhb:

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

commit 40484d3117d9520de3755d5c91ddb26ed7ce6bcb
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2025-08-06 19:57:27 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2025-08-06 19:57:27 +0000

    ctld: Use freebsd::fd_up to manage the lifecycle of accepted sockets
    
    Explicitly hand off ownership of accepted sockets to the
    portal::handle_connection method.
    
    Reviewed by:    asomers
    Sponsored by:   Chelsio Communications
    Differential Revision:  https://reviews.freebsd.org/D51729
---
 usr.sbin/ctld/ctld.cc  |  8 +++-----
 usr.sbin/ctld/ctld.hh  |  2 +-
 usr.sbin/ctld/iscsi.cc | 12 ++++++------
 usr.sbin/ctld/iscsi.hh |  5 +++--
 usr.sbin/ctld/login.cc |  2 +-
 5 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc
index 4821bdb030c1..451245b8d5fa 100644
--- a/usr.sbin/ctld/ctld.cc
+++ b/usr.sbin/ctld/ctld.cc
@@ -2166,7 +2166,7 @@ wait_for_children(bool block)
 }
 
 static void
-handle_connection(struct portal *portal, int fd,
+handle_connection(struct portal *portal, freebsd::fd_up fd,
     const struct sockaddr *client_sa, bool dont_fork)
 {
 	struct portal_group *pg;
@@ -2197,10 +2197,8 @@ handle_connection(struct portal *portal, int fd,
 		pid = fork();
 		if (pid < 0)
 			log_err(1, "fork");
-		if (pid > 0) {
-			close(fd);
+		if (pid > 0)
 			return;
-		}
 		conf->close_pidfile();
 	}
 
@@ -2214,7 +2212,7 @@ handle_connection(struct portal *portal, int fd,
 	log_set_peer_addr(host);
 	setproctitle("%s", host);
 
-	portal->handle_connection(fd, host, client_sa);
+	portal->handle_connection(std::move(fd), host, client_sa);
 	log_debugx("nothing more to do; exiting");
 	exit(0);
 }
diff --git a/usr.sbin/ctld/ctld.hh b/usr.sbin/ctld/ctld.hh
index 7842f1bb5715..6ecee3b73c4f 100644
--- a/usr.sbin/ctld/ctld.hh
+++ b/usr.sbin/ctld/ctld.hh
@@ -144,7 +144,7 @@ struct portal {
 	bool reuse_socket(portal &oldp);
 	bool init_socket();
 	virtual bool init_socket_options(int s __unused) { return true; }
-	virtual void handle_connection(int fd, const char *host,
+	virtual void handle_connection(freebsd::fd_up fd, const char *host,
 	    const struct sockaddr *client_sa) = 0;
 
 	portal_group *portal_group() { return p_portal_group; }
diff --git a/usr.sbin/ctld/iscsi.cc b/usr.sbin/ctld/iscsi.cc
index 8d32974ab504..bee036b95bf2 100644
--- a/usr.sbin/ctld/iscsi.cc
+++ b/usr.sbin/ctld/iscsi.cc
@@ -61,7 +61,7 @@ struct iscsi_portal final : public portal {
 		portal(pg, listen, protocol, std::move(ai)) {}
 
 	bool init_socket_options(int s) override;
-	void handle_connection(int fd, const char *host,
+	void handle_connection(freebsd::fd_up fd, const char *host,
 	    const struct sockaddr *client_sa) override;
 };
 
@@ -410,13 +410,13 @@ pdu_fail(const struct connection *conn __unused, const char *reason __unused)
 {
 }
 
-iscsi_connection::iscsi_connection(struct portal *portal, int fd,
+iscsi_connection::iscsi_connection(struct portal *portal, freebsd::fd_up fd,
     const char *host, const struct sockaddr *client_sa) :
-	conn_portal(portal), conn_initiator_addr(host),
+	conn_portal(portal), conn_fd(std::move(fd)), conn_initiator_addr(host),
 	conn_initiator_sa(client_sa)
 {
 	connection_init(&conn, &conn_ops, proxy_mode);
-	conn.conn_socket = fd;
+	conn.conn_socket = conn_fd;
 }
 
 iscsi_connection::~iscsi_connection()
@@ -496,12 +496,12 @@ iscsi_connection::handle()
 }
 
 void
-iscsi_portal::handle_connection(int fd, const char *host,
+iscsi_portal::handle_connection(freebsd::fd_up fd, const char *host,
     const struct sockaddr *client_sa)
 {
 	struct conf *conf = portal_group()->conf();
 
-	iscsi_connection conn(this, fd, host, client_sa);
+	iscsi_connection conn(this, std::move(fd), host, client_sa);
 	start_timer(conf->timeout(), true);
 	kernel_capsicate();
 	conn.handle();
diff --git a/usr.sbin/ctld/iscsi.hh b/usr.sbin/ctld/iscsi.hh
index 5a6729541119..d510e8c6731b 100644
--- a/usr.sbin/ctld/iscsi.hh
+++ b/usr.sbin/ctld/iscsi.hh
@@ -36,8 +36,8 @@
 #define	CONN_SESSION_TYPE_NORMAL	2
 
 struct iscsi_connection {
-	iscsi_connection(struct portal *portal, int fd, const char *host,
-	    const struct sockaddr *client_sa);
+	iscsi_connection(struct portal *portal, freebsd::fd_up fd,
+	    const char *host, const struct sockaddr *client_sa);
 	~iscsi_connection();
 
 	void handle();
@@ -61,6 +61,7 @@ private:
 	struct portal		*conn_portal = nullptr;
 	const struct port	*conn_port = nullptr;
 	struct target		*conn_target = nullptr;
+	freebsd::fd_up		conn_fd;
 	int			conn_session_type = CONN_SESSION_TYPE_NONE;
 	std::string		conn_initiator_name;
 	std::string		conn_initiator_addr;
diff --git a/usr.sbin/ctld/login.cc b/usr.sbin/ctld/login.cc
index 87e8d3092fef..cda11cc1f21b 100644
--- a/usr.sbin/ctld/login.cc
+++ b/usr.sbin/ctld/login.cc
@@ -752,7 +752,7 @@ iscsi_connection::login_negotiate(struct pdu *request)
 		conn_max_burst_limit = (1 << 24) - 1;
 		conn_first_burst_limit = (1 << 24) - 1;
 		kernel_limits(pg->offload(),
-		    conn.conn_socket,
+		    conn_fd,
 		    &conn_max_recv_data_segment_limit,
 		    &conn_max_send_data_segment_limit,
 		    &conn_max_burst_limit,