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.