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:			779f106aa1
This commit is contained in:
Gleb Smirnoff 2023-11-17 09:23:58 -08:00
parent 5bcd2d5a43
commit efad7cbfdc

View file

@ -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;
}