Page MenuHomeFreeBSD

D31973.id95226.diff
No OneTemporary

D31973.id95226.diff

Index: sys/kern/uipc_socket.c
===================================================================
--- sys/kern/uipc_socket.c
+++ sys/kern/uipc_socket.c
@@ -1223,6 +1223,7 @@
soclose(struct socket *so)
{
struct accept_queue lqueue;
+ struct socket *sp, *tsp;
int error = 0;
KASSERT(!(so->so_state & SS_NOFDREF), ("soclose: SS_NOFDREF on enter"));
@@ -1257,11 +1258,9 @@
if (so->so_proto->pr_usrreqs->pru_close != NULL)
(*so->so_proto->pr_usrreqs->pru_close)(so);
+ TAILQ_INIT(&lqueue);
SOCK_LOCK(so);
if (SOLISTENING(so)) {
- struct socket *sp;
-
- TAILQ_INIT(&lqueue);
TAILQ_SWAP(&lqueue, &so->sol_incomp, socket, so_list);
TAILQ_CONCAT(&lqueue, &so->sol_comp, so_list);
@@ -1279,17 +1278,14 @@
KASSERT((so->so_state & SS_NOFDREF) == 0, ("soclose: NOFDREF"));
so->so_state |= SS_NOFDREF;
sorele(so);
- if (SOLISTENING(so)) {
- struct socket *sp, *tsp;
-
- TAILQ_FOREACH_SAFE(sp, &lqueue, so_list, tsp) {
- SOCK_LOCK(sp);
- if (sp->so_count == 0) {
- SOCK_UNLOCK(sp);
- soabort(sp);
- } else
- /* sp is now in sofree() */
- SOCK_UNLOCK(sp);
+ TAILQ_FOREACH_SAFE(sp, &lqueue, so_list, tsp) {
+ SOCK_LOCK(sp);
+ if (refcount_load(&sp->so_count) == 0) {
+ SOCK_UNLOCK(sp);
+ soabort(sp);
+ } else {
+ /* sp is now in sofree() */
+ SOCK_UNLOCK(sp);
}
}
CURVNET_RESTORE();

File Metadata

Mime Type
text/plain
Expires
Thu, Apr 9, 10:47 PM (19 h, 11 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31175275
Default Alt Text
D31973.id95226.diff (1 KB)

Event Timeline