diff options
author | Gleb Smirnoff <glebius@FreeBSD.org> | 2022-05-12 20:22:39 +0000 |
---|---|---|
committer | Gleb Smirnoff <glebius@FreeBSD.org> | 2022-05-12 20:22:39 +0000 |
commit | bb35a4e11d5ec70f99cd36caf5290a33afc9a515 (patch) | |
tree | ef18c575aa81cd40e6652140dca66d08d0d03d55 | |
parent | 08f17d1432893f9434ce2e32aa62cc691e3f37cf (diff) | |
download | src-bb35a4e11d5ec70f99cd36caf5290a33afc9a515.tar.gz src-bb35a4e11d5ec70f99cd36caf5290a33afc9a515.zip |
-rw-r--r-- | sys/kern/uipc_usrreq.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 13fa7acfcdf3..d4e3b25c5479 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1634,6 +1634,9 @@ unp_connectat(int fd, struct socket *so, struct sockaddr *nam, sotounpcb(so2) == unp2, ("%s: unp2 %p so2 %p", __func__, unp2, so2)); unp_connect2(so, so2, PRU_CONNECT); + KASSERT((unp->unp_flags & UNP_CONNECTING) != 0, + ("%s: unp %p has UNP_CONNECTING clear", __func__, unp)); + unp->unp_flags &= ~UNP_CONNECTING; unp_pcb_unlock_pair(unp, unp2); bad2: mtx_unlock(vplock); @@ -1642,11 +1645,13 @@ bad: vput(vp); } free(sa, M_SONAME); - UNP_PCB_LOCK(unp); - KASSERT((unp->unp_flags & UNP_CONNECTING) != 0, - ("%s: unp %p has UNP_CONNECTING clear", __func__, unp)); - unp->unp_flags &= ~UNP_CONNECTING; - UNP_PCB_UNLOCK(unp); + if (__predict_false(error)) { + UNP_PCB_LOCK(unp); + KASSERT((unp->unp_flags & UNP_CONNECTING) != 0, + ("%s: unp %p has UNP_CONNECTING clear", __func__, unp)); + unp->unp_flags &= ~UNP_CONNECTING; + UNP_PCB_UNLOCK(unp); + } return (error); } |