aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2023-11-17 17:23:58 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2023-11-17 17:23:58 +0000
commitefad7cbfdc06e92bcc589a6c0cae2f3bea0d5cb9 (patch)
tree1c4308b19f93923916c5b6ef0ae42cdd2d6f672c
parent5bcd2d5a43c0eef256f932d726c0ed764945b17f (diff)
downloadsrc-efad7cbfdc06e92bcc589a6c0cae2f3bea0d5cb9.tar.gz
src-efad7cbfdc06e92bcc589a6c0cae2f3bea0d5cb9.zip
ng_ksocket: fix upcall clearing on node shutdown
Note: imho, the proper solution would be to guarantee that upcalls won't ever be called after soclose(), but this isn't the case, yet. This change at least makes the node work the way it always worked. Reviewed by: afedorov Differential Revision: https://reviews.freebsd.org/D42636 PR: 272319 PR: 275106 Fixes: 779f106aa169256b7010a1d8f963ff656b881e92
-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;
}