mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 21:05:08 +00:00
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:
parent
5bcd2d5a43
commit
efad7cbfdc
|
@ -929,17 +929,24 @@ static int
|
||||||
ng_ksocket_shutdown(node_p node)
|
ng_ksocket_shutdown(node_p node)
|
||||||
{
|
{
|
||||||
const priv_p priv = NG_NODE_PRIVATE(node);
|
const priv_p priv = NG_NODE_PRIVATE(node);
|
||||||
|
struct socket *so = priv->so;
|
||||||
priv_p embryo;
|
priv_p embryo;
|
||||||
|
|
||||||
/* Close our socket (if any) */
|
/* Close our socket (if any) */
|
||||||
if (priv->so != NULL) {
|
if (priv->so != NULL) {
|
||||||
SOCKBUF_LOCK(&priv->so->so_rcv);
|
if (SOLISTENING(so)) {
|
||||||
soupcall_clear(priv->so, SO_RCV);
|
SOLISTEN_LOCK(so);
|
||||||
SOCKBUF_UNLOCK(&priv->so->so_rcv);
|
solisten_upcall_set(so, NULL, NULL);
|
||||||
SOCKBUF_LOCK(&priv->so->so_snd);
|
SOLISTEN_UNLOCK(so);
|
||||||
soupcall_clear(priv->so, SO_SND);
|
} else {
|
||||||
SOCKBUF_UNLOCK(&priv->so->so_snd);
|
SOCK_RECVBUF_LOCK(so);
|
||||||
soclose(priv->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;
|
priv->so = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue