summaryrefslogtreecommitdiff
path: root/sys/netgraph
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2023-11-17 17:23:58 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2023-11-30 17:01:39 +0000
commit09f4b840bd7cb6427af2a28a10bd839da6dd76d5 (patch)
treeab9695e69c4e19e3d9535898f909da98b53179e2 /sys/netgraph
parent60314995efa05b81839556fb31ed036703885d84 (diff)
Diffstat (limited to 'sys/netgraph')
-rw-r--r--sys/netgraph/ng_ksocket.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/sys/netgraph/ng_ksocket.c b/sys/netgraph/ng_ksocket.c
index 7e5be8c211ae..337248789473 100644
--- a/sys/netgraph/ng_ksocket.c
+++ b/sys/netgraph/ng_ksocket.c
@@ -929,17 +929,24 @@ static int
ng_ksocket_shutdown(node_p node)
{
const priv_p priv = NG_NODE_PRIVATE(node);
+ struct socket *so = priv->so;
priv_p embryo;
/* Close our socket (if any) */
if (priv->so != NULL) {
- SOCKBUF_LOCK(&priv->so->so_rcv);
- soupcall_clear(priv->so, SO_RCV);
- SOCKBUF_UNLOCK(&priv->so->so_rcv);
- SOCKBUF_LOCK(&priv->so->so_snd);
- soupcall_clear(priv->so, SO_SND);
- SOCKBUF_UNLOCK(&priv->so->so_snd);
- soclose(priv->so);
+ if (SOLISTENING(so)) {
+ SOLISTEN_LOCK(so);
+ solisten_upcall_set(so, NULL, NULL);
+ SOLISTEN_UNLOCK(so);
+ } else {
+ SOCK_RECVBUF_LOCK(so);
+ soupcall_clear(so, SO_RCV);
+ SOCK_RECVBUF_UNLOCK(so);
+ SOCK_SENDBUF_LOCK(so);
+ soupcall_clear(so, SO_SND);
+ SOCK_SENDBUF_UNLOCK(so);
+ }
+ soclose(so);
priv->so = NULL;
}