git: 9b27a22ac696 - main - unix: factor unp_connectat_peer() out of unp_connectat()

Mark Johnston <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.src
Message-ID <6a7a0d13.405c2.302bb8f0__4764.05213573656$1786383785$gmane$org@gitrepo.freebsd.org>
The branch main has been updated by markj:

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

commit 9b27a22ac69632d50e3561fd15ca710c022f3e70
Author:     John Ericson <[email protected]>
AuthorDate: 2026-08-10 15:04:27 +0000
Commit:     Mark Johnston <[email protected]>
CommitDate: 2026-08-10 17:31:21 +0000

    unix: factor unp_connectat_peer() out of unp_connectat()
    
    Move the "resolve a connectat(2) target to a referenced peer socket"
    half of `unp_connectat()` -- the `namei()` lookup and `unp_vnode_peer()`
    call -- into a helper, leaving `unp_connectat()` with the connection state
    machine plus a single `unp_connect_peer()`.
    
    This is where the next change grows the ways a peer can be named; keeping
    it a helper up front keeps that change focused on the new resolution
    logic.
    
    No functional change intended.
    
    Signed-off-by: John Ericson <[email protected]>
    Assisted-by: Claude Code (Claude Opus 4.8 and Fable 5)
    
    Reviewed by:    markj
    MFC after:      2 weeks
    Differential Revision:  https://reviews.freebsd.org/D58462
---
 sys/kern/uipc_usrreq.c | 53 +++++++++++++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 18 deletions(-)

diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c
index 418c43a8ac85..60b0f3b8706e 100644
--- a/sys/kern/uipc_usrreq.c
+++ b/sys/kern/uipc_usrreq.c
@@ -296,6 +296,8 @@ static int	unp_connectat(int, struct socket *, struct sockaddr *,
 		    struct thread *, struct socket **);
 static int	unp_connect_peer(struct socket *, struct unpcb *,
 		    struct sockaddr **, struct thread *, bool);
+static int	unp_connectat_peer(struct thread *, int, const char *,
+		    struct socket **);
 static int	unp_vnode_peer(struct vnode *, struct thread *,
 		    struct socket **);
 static void	unp_connect2(struct socket *, struct socket *, bool);
@@ -2934,10 +2936,8 @@ unp_connectat(int fd, struct socket *so, struct sockaddr *nam,
 {
 	struct socket *so2;
 	struct unpcb *unp;
-	struct nameidata nd;
 	char buf[SOCK_MAXADDRLEN];
 	struct sockaddr *sa;
-	cap_rights_t rights;
 	const char *path;
 	int error, len;
 	bool connreq;
@@ -2994,22 +2994,7 @@ unp_connectat(int fd, struct socket *so, struct sockaddr *nam,
 		sa = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK);
 	else
 		sa = NULL;
-	NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF |
-	    (fd == AT_FDCWD ? 0 : EMPTYPATH), UIO_SYSSPACE, buf, fd,
-	    cap_rights_init_one(&rights, CAP_CONNECTAT));
-	error = namei(&nd);
-	if (error)
-		goto out;
-	NDFREE_PNBUF(&nd);
-
-	/*
-	 * Resolve the vnode to a referenced peer socket and drop the vnode
-	 * before connecting: the reference keeps the peer stable, so no vnode
-	 * lock is held across unp_connect_peer() (which matters for the
-	 * return_locked datagram fast path).
-	 */
-	error = unp_vnode_peer(nd.ni_vp, td, &so2);
-	vput(nd.ni_vp);
+	error = unp_connectat_peer(td, fd, buf, &so2);
 	if (error != 0)
 		goto out;
 	error = unp_connect_peer(so, sotounpcb(so2), &sa, td,
@@ -3031,6 +3016,38 @@ out:
 	return (error);
 }
 
+/*
+ * Resolve a connectat(2) target -- descriptor 'fd' and the pathname in 'buf' --
+ * to a referenced peer unix socket in '*so2p'.  The caller must release it with
+ * sorele().
+ */
+static int
+unp_connectat_peer(struct thread *td, int fd, const char *buf,
+    struct socket **so2p)
+{
+	struct nameidata nd;
+	cap_rights_t rights;
+	int error;
+
+	NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF |
+	    (fd == AT_FDCWD ? 0 : EMPTYPATH), UIO_SYSSPACE, buf, fd,
+	    cap_rights_init_one(&rights, CAP_CONNECTAT));
+	error = namei(&nd);
+	if (error != 0)
+		return (error);
+	NDFREE_PNBUF(&nd);
+
+	/*
+	 * Resolve the vnode to a referenced peer socket and drop the vnode
+	 * before connecting: the reference keeps the peer stable, so no vnode
+	 * lock is held across unp_connect_peer() (which matters for the
+	 * return_locked datagram fast path).
+	 */
+	error = unp_vnode_peer(nd.ni_vp, td, so2p);
+	vput(nd.ni_vp);
+	return (error);
+}
+
 /*
  * Resolve locked vnode 'vp' to the unix-domain socket it names and return a
  * referenced peer socket in '*so2p'.  As the connect(2)-time resolution, this
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.