Signed-off-by: Waldemar Kozaczuk <[email protected]>
---
 bsd/sys/kern/uipc_socket.cc   | 11 +++++++----
 bsd/sys/net/raw_usrreq.cc     |  3 ++-
 bsd/sys/net/rtsock.cc         |  5 ++---
 bsd/sys/netinet/raw_ip.cc     |  3 ++-
 bsd/sys/netinet/tcp_usrreq.cc |  6 ++++--
 bsd/sys/netinet/udp_usrreq.cc |  3 ++-
 bsd/sys/sys/protosw.h         |  2 +-
 7 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/bsd/sys/kern/uipc_socket.cc b/bsd/sys/kern/uipc_socket.cc
index 9f27cfc6..ed4d251c 100644
--- a/bsd/sys/kern/uipc_socket.cc
+++ b/bsd/sys/kern/uipc_socket.cc
@@ -699,11 +699,14 @@ soabort(struct socket *so)
        KASSERT((so->so_state & SQ_INCOMP) == 0, ("soabort: SQ_INCOMP"));
        VNET_SO_ASSERT(so);
 
+       bool socket_freed = false;
        if (so->so_proto->pr_usrreqs->pru_abort != NULL)
-               (*so->so_proto->pr_usrreqs->pru_abort)(so);
-       ACCEPT_LOCK();
-       SOCK_LOCK(so);
-       sofree(so);
+               socket_freed = (*so->so_proto->pr_usrreqs->pru_abort)(so);
+       if (!socket_freed) {
+               ACCEPT_LOCK();
+               SOCK_LOCK(so);
+               sofree(so);
+       }
 }
 
 int
diff --git a/bsd/sys/net/raw_usrreq.cc b/bsd/sys/net/raw_usrreq.cc
index ee7caf9f..641fd2fa 100644
--- a/bsd/sys/net/raw_usrreq.cc
+++ b/bsd/sys/net/raw_usrreq.cc
@@ -122,13 +122,14 @@ raw_ctlinput(int cmd, struct bsd_sockaddr *arg, void 
*dummy)
        /* INCOMPLETE */
 }
 
-static void
+static bool
 raw_uabort(struct socket *so)
 {
 
        KASSERT(sotorawcb(so) != NULL, ("raw_uabort: rp == NULL"));
 
        soisdisconnected(so);
+       return true;
 }
 
 static void
diff --git a/bsd/sys/net/rtsock.cc b/bsd/sys/net/rtsock.cc
index 49a92947..c4fd36a5 100644
--- a/bsd/sys/net/rtsock.cc
+++ b/bsd/sys/net/rtsock.cc
@@ -207,11 +207,10 @@ rts_input(struct mbuf *m)
  * It really doesn't make any sense at all for this code to share much
  * with raw_usrreq.c, since its functionality is so restricted.  XXX
  */
-static void
+static bool
 rts_abort(struct socket *so)
 {
-
-       raw_usrreqs.pru_abort(so);
+       return raw_usrreqs.pru_abort(so);
 }
 
 static void
diff --git a/bsd/sys/netinet/raw_ip.cc b/bsd/sys/netinet/raw_ip.cc
index 0d93800a..3a2b2e37 100644
--- a/bsd/sys/netinet/raw_ip.cc
+++ b/bsd/sys/netinet/raw_ip.cc
@@ -786,7 +786,7 @@ rip_dodisconnect(struct socket *so, struct inpcb *inp)
        INP_INFO_WUNLOCK(pcbinfo);
 }
 
-static void
+static bool
 rip_abort(struct socket *so)
 {
        struct inpcb *inp;
@@ -795,6 +795,7 @@ rip_abort(struct socket *so)
        KASSERT(inp != NULL, ("rip_abort: inp == NULL"));
 
        rip_dodisconnect(so, inp);
+       return true;
 }
 
 static void
diff --git a/bsd/sys/netinet/tcp_usrreq.cc b/bsd/sys/netinet/tcp_usrreq.cc
index f2b80e09..6733e884 100644
--- a/bsd/sys/netinet/tcp_usrreq.cc
+++ b/bsd/sys/netinet/tcp_usrreq.cc
@@ -891,11 +891,12 @@ out:
 /*
  * Abort the TCP.  Drop the connection abruptly.
  */
-static void
+static bool
 tcp_usr_abort(struct socket *so)
 {
        struct inpcb *inp;
        struct tcpcb *tp = NULL;
+       bool socket_freed = false;
        TCPDEBUG0;
 
        inp = sotoinpcb(so);
@@ -913,7 +914,7 @@ tcp_usr_abort(struct socket *so)
            !(inp->inp_flags & INP_DROPPED)) {
                tp = intotcpcb(inp);
                TCPDEBUG1();
-               tcp_drop(tp, ECONNABORTED);
+               socket_freed = NULL == tcp_drop(tp, ECONNABORTED);
                TCPDEBUG2(PRU_ABORT);
        }
        if (!(inp->inp_flags & INP_DROPPED)) {
@@ -922,6 +923,7 @@ tcp_usr_abort(struct socket *so)
        }
        INP_UNLOCK(inp);
        INP_INFO_WUNLOCK(&V_tcbinfo);
+       return socket_freed;
 }
 
 /*
diff --git a/bsd/sys/netinet/udp_usrreq.cc b/bsd/sys/netinet/udp_usrreq.cc
index 441a065e..7bcd8ba7 100644
--- a/bsd/sys/netinet/udp_usrreq.cc
+++ b/bsd/sys/netinet/udp_usrreq.cc
@@ -1333,7 +1333,7 @@ udp4_espdecap(struct inpcb *inp, struct mbuf *m, int off)
 }
 #endif /* defined(IPSEC) && defined(IPSEC_NAT_T) */
 
-static void
+static bool
 udp_abort(struct socket *so)
 {
        struct inpcb *inp;
@@ -1349,6 +1349,7 @@ udp_abort(struct socket *so)
                soisdisconnected(so);
        }
        INP_UNLOCK(inp);
+       return true;
 }
 
 static int
diff --git a/bsd/sys/sys/protosw.h b/bsd/sys/sys/protosw.h
index 7db69f25..dd211c1f 100644
--- a/bsd/sys/sys/protosw.h
+++ b/bsd/sys/sys/protosw.h
@@ -189,7 +189,7 @@ struct uio;
  * See uipc_domain.c:net_init_domain()
  */
 struct pr_usrreqs {
-       void    (*pru_abort)(struct socket *so);
+       bool (*pru_abort)(struct socket *so);
        int     (*pru_accept)(struct socket *so, struct bsd_sockaddr **nam);
        int     (*pru_attach)(struct socket *so, int proto, struct thread *td);
        int     (*pru_bind)(struct socket *so, struct bsd_sockaddr *nam,
-- 
2.19.1

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to