The branch main has been updated by jhb:

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

commit 40484d3117d9520de3755d5c91ddb26ed7ce6bcb
Author:     John Baldwin <j...@freebsd.org>
AuthorDate: 2025-08-06 19:57:27 +0000
Commit:     John Baldwin <j...@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,

Reply via email to