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 *);
> 

Reply via email to