Only unix(4) sockets have pru_connect2() support. This movement makes
soconnect2() just pru_connect2() wrapper and removes "persocket" logic
from this path. Since the pru_*() request handlers are the separate
functions, this doesn't introduce locking inconsistency to the pcb
layer.

Also, we already have dummy soabort(), so it looks reasonable to turn it
inline with the soconnect2().

Index: sys/kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.291
diff -u -p -r1.291 uipc_socket.c
--- sys/kern/uipc_socket.c      28 Nov 2022 21:39:28 -0000      1.291
+++ sys/kern/uipc_socket.c      9 Dec 2022 21:42:09 -0000
@@ -484,19 +484,7 @@ soconnect(struct socket *so, struct mbuf
 int
 soconnect2(struct socket *so1, struct socket *so2)
 {
-       int persocket, error;
-
-       if ((persocket = solock_persocket(so1)))
-               solock_pair(so1, so2);
-       else
-               solock(so1);
-
-       error = pru_connect2(so1, so2);
-
-       if (persocket)
-               sounlock(so2);
-       sounlock(so1);
-       return (error);
+       return pru_connect2(so1, so2);
 }
 
 int
Index: sys/kern/uipc_usrreq.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_usrreq.c,v
retrieving revision 1.195
diff -u -p -r1.195 uipc_usrreq.c
--- sys/kern/uipc_usrreq.c      5 Dec 2022 23:18:37 -0000       1.195
+++ sys/kern/uipc_usrreq.c      9 Dec 2022 21:42:09 -0000
@@ -678,8 +678,10 @@ uipc_connect2(struct socket *so, struct 
        struct unpcb *unp = sotounpcb(so), *unp2;
        int error;
 
+       solock_pair(so, so2);
+
        if ((error = unp_connect2(so, so2)))
-               return (error);
+               goto error;
 
        unp->unp_connid.uid = curproc->p_ucred->cr_uid;
        unp->unp_connid.gid = curproc->p_ucred->cr_gid;
@@ -690,8 +692,11 @@ uipc_connect2(struct socket *so, struct 
        unp2->unp_connid.gid = curproc->p_ucred->cr_gid;
        unp2->unp_connid.pid = curproc->p_p->ps_pid;
        unp2->unp_flags |= UNP_FEIDS;
+error:
+       sounlock(so);
+       sounlock(so2);
 
-       return (0);
+       return (error);
 }
 
 int

Reply via email to