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