On Mon, Nov 14, 2022 at 12:11:46PM +0300, Vitaliy Makkoveev wrote:
> uipc_bind() only calls unp_bind(). Also it is the only caller of
> unp_bind().
For *_bind() alone this looks like zapping a useless indirection, but
the rest of uipc_*() seems to consistently use unp_*() still, so I'm not
convinced this one-off merge is an improvement.
>
> Index: sys/kern/uipc_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_usrreq.c,v
> retrieving revision 1.192
> diff -u -p -r1.192 uipc_usrreq.c
> --- sys/kern/uipc_usrreq.c 13 Nov 2022 16:01:32 -0000 1.192
> +++ sys/kern/uipc_usrreq.c 14 Nov 2022 09:07:43 -0000
> @@ -322,8 +322,93 @@ int
> uipc_bind(struct socket *so, struct mbuf *nam, struct proc *p)
> {
> struct unpcb *unp = sotounpcb(so);
> + struct sockaddr_un *soun;
> + struct mbuf *nam2;
> + struct vnode *vp;
> + struct vattr vattr;
> + int error;
> + struct nameidata nd;
> + size_t pathlen;
>
> - return unp_bind(unp, nam, p);
> + if (unp->unp_flags & (UNP_BINDING | UNP_CONNECTING))
> + return (EINVAL);
> + if (unp->unp_vnode != NULL)
> + return (EINVAL);
> + if ((error = unp_nam2sun(nam, &soun, &pathlen)))
> + return (error);
> +
> + unp->unp_flags |= UNP_BINDING;
> +
> + /*
> + * Enforce `i_lock' -> `unplock' because fifo subsystem
> + * requires it. The socket can't be closed concurrently
> + * because the file descriptor reference is still held.
> + */
> +
> + sounlock(unp->unp_socket);
> +
> + nam2 = m_getclr(M_WAITOK, MT_SONAME);
> + nam2->m_len = sizeof(struct sockaddr_un);
> + memcpy(mtod(nam2, struct sockaddr_un *), soun,
> + offsetof(struct sockaddr_un, sun_path) + pathlen);
> + /* No need to NUL terminate: m_getclr() returns zero'd mbufs. */
> +
> + soun = mtod(nam2, struct sockaddr_un *);
> +
> + /* Fixup sun_len to keep it in sync with m_len. */
> + soun->sun_len = nam2->m_len;
> +
> + NDINIT(&nd, CREATE, NOFOLLOW | LOCKPARENT, UIO_SYSSPACE,
> + soun->sun_path, p);
> + nd.ni_pledge = PLEDGE_UNIX;
> + nd.ni_unveil = UNVEIL_CREATE;
> +
> + KERNEL_LOCK();
> +/* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */
> + error = namei(&nd);
> + if (error != 0) {
> + m_freem(nam2);
> + solock(unp->unp_socket);
> + goto out;
> + }
> + vp = nd.ni_vp;
> + if (vp != NULL) {
> + VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
> + if (nd.ni_dvp == vp)
> + vrele(nd.ni_dvp);
> + else
> + vput(nd.ni_dvp);
> + vrele(vp);
> + m_freem(nam2);
> + error = EADDRINUSE;
> + solock(unp->unp_socket);
> + goto out;
> + }
> + VATTR_NULL(&vattr);
> + vattr.va_type = VSOCK;
> + vattr.va_mode = ACCESSPERMS &~ p->p_fd->fd_cmask;
> + error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
> + vput(nd.ni_dvp);
> + if (error) {
> + m_freem(nam2);
> + solock(unp->unp_socket);
> + goto out;
> + }
> + solock(unp->unp_socket);
> + unp->unp_addr = nam2;
> + vp = nd.ni_vp;
> + vp->v_socket = unp->unp_socket;
> + unp->unp_vnode = vp;
> + unp->unp_connid.uid = p->p_ucred->cr_uid;
> + unp->unp_connid.gid = p->p_ucred->cr_gid;
> + unp->unp_connid.pid = p->p_p->ps_pid;
> + unp->unp_flags |= UNP_FEIDSBIND;
> + VOP_UNLOCK(vp);
> +out:
> + KERNEL_UNLOCK();
> + unp->unp_flags &= ~UNP_BINDING;
> +
> + return (error);
> }
>
> int
> @@ -724,98 +809,6 @@ unp_detach(struct unpcb *unp)
> }
>
> int
> -unp_bind(struct unpcb *unp, struct mbuf *nam, struct proc *p)
> -{
> - struct sockaddr_un *soun;
> - struct mbuf *nam2;
> - struct vnode *vp;
> - struct vattr vattr;
> - int error;
> - struct nameidata nd;
> - size_t pathlen;
> -
> - if (unp->unp_flags & (UNP_BINDING | UNP_CONNECTING))
> - return (EINVAL);
> - if (unp->unp_vnode != NULL)
> - return (EINVAL);
> - if ((error = unp_nam2sun(nam, &soun, &pathlen)))
> - return (error);
> -
> - unp->unp_flags |= UNP_BINDING;
> -
> - /*
> - * Enforce `i_lock' -> `unplock' because fifo subsystem
> - * requires it. The socket can't be closed concurrently
> - * because the file descriptor reference is still held.
> - */
> -
> - sounlock(unp->unp_socket);
> -
> - nam2 = m_getclr(M_WAITOK, MT_SONAME);
> - nam2->m_len = sizeof(struct sockaddr_un);
> - memcpy(mtod(nam2, struct sockaddr_un *), soun,
> - offsetof(struct sockaddr_un, sun_path) + pathlen);
> - /* No need to NUL terminate: m_getclr() returns zero'd mbufs. */
> -
> - soun = mtod(nam2, struct sockaddr_un *);
> -
> - /* Fixup sun_len to keep it in sync with m_len. */
> - soun->sun_len = nam2->m_len;
> -
> - NDINIT(&nd, CREATE, NOFOLLOW | LOCKPARENT, UIO_SYSSPACE,
> - soun->sun_path, p);
> - nd.ni_pledge = PLEDGE_UNIX;
> - nd.ni_unveil = UNVEIL_CREATE;
> -
> - KERNEL_LOCK();
> -/* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */
> - error = namei(&nd);
> - if (error != 0) {
> - m_freem(nam2);
> - solock(unp->unp_socket);
> - goto out;
> - }
> - vp = nd.ni_vp;
> - if (vp != NULL) {
> - VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
> - if (nd.ni_dvp == vp)
> - vrele(nd.ni_dvp);
> - else
> - vput(nd.ni_dvp);
> - vrele(vp);
> - m_freem(nam2);
> - error = EADDRINUSE;
> - solock(unp->unp_socket);
> - goto out;
> - }
> - VATTR_NULL(&vattr);
> - vattr.va_type = VSOCK;
> - vattr.va_mode = ACCESSPERMS &~ p->p_fd->fd_cmask;
> - error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
> - vput(nd.ni_dvp);
> - if (error) {
> - m_freem(nam2);
> - solock(unp->unp_socket);
> - goto out;
> - }
> - solock(unp->unp_socket);
> - unp->unp_addr = nam2;
> - vp = nd.ni_vp;
> - vp->v_socket = unp->unp_socket;
> - unp->unp_vnode = vp;
> - unp->unp_connid.uid = p->p_ucred->cr_uid;
> - unp->unp_connid.gid = p->p_ucred->cr_gid;
> - unp->unp_connid.pid = p->p_p->ps_pid;
> - unp->unp_flags |= UNP_FEIDSBIND;
> - VOP_UNLOCK(vp);
> -out:
> - KERNEL_UNLOCK();
> - unp->unp_flags &= ~UNP_BINDING;
> -
> - return (error);
> -}
> -
> -int
> unp_connect(struct socket *so, struct mbuf *nam, struct proc *p)
> {
> struct sockaddr_un *soun;
> @@ -890,7 +883,7 @@ unp_connect(struct socket *so, struct mb
>
> /*
> * `unp_addr', `unp_connid' and 'UNP_FEIDSBIND' flag
> - * are immutable since we set them in unp_bind().
> + * are immutable since we set them in uipc_bind().
> */
> if (unp2->unp_addr)
> unp3->unp_addr =
> Index: sys/sys/unpcb.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/unpcb.h,v
> retrieving revision 1.44
> diff -u -p -r1.44 unpcb.h
> --- sys/sys/unpcb.h 13 Nov 2022 16:01:32 -0000 1.44
> +++ sys/sys/unpcb.h 14 Nov 2022 09:07:43 -0000
> @@ -134,7 +134,6 @@ int uipc_peeraddr(struct socket *, struc
> int uipc_connect2(struct socket *, struct socket *);
>
> void unp_init(void);
> -int unp_bind(struct unpcb *, struct mbuf *, struct proc *);
> int unp_connect(struct socket *, struct mbuf *, struct proc *);
> int unp_connect2(struct socket *, struct socket *);
> void unp_detach(struct unpcb *);
>