Remove the pcb from the rawcb list before sofree'ing it.
Don't reacquire softnet_lock until after we've freed the pcb.
This commit is contained in:
parent
e61fddb8f9
commit
cc99e2f48f
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: raw_cb.c,v 1.19 2008/04/24 11:38:37 ad Exp $ */
|
/* $NetBSD: raw_cb.c,v 1.20 2008/08/04 06:19:35 matt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1980, 1986, 1993
|
* Copyright (c) 1980, 1986, 1993
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: raw_cb.c,v 1.19 2008/04/24 11:38:37 ad Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: raw_cb.c,v 1.20 2008/08/04 06:19:35 matt Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
@ -97,18 +97,18 @@ raw_detach(struct rawcb *rp)
|
||||||
{
|
{
|
||||||
struct socket *so = rp->rcb_socket;
|
struct socket *so = rp->rcb_socket;
|
||||||
|
|
||||||
so->so_pcb = 0;
|
so->so_pcb = NULL;
|
||||||
KASSERT(so->so_lock == softnet_lock); /* XXX */
|
KASSERT(so->so_lock == softnet_lock); /* XXX */
|
||||||
|
LIST_REMOVE(rp, rcb_list); /* remove last reference */
|
||||||
/* sofree drops the socket's lock. */
|
/* sofree drops the socket's lock. */
|
||||||
sofree(so);
|
sofree(so);
|
||||||
mutex_enter(softnet_lock);
|
|
||||||
LIST_REMOVE(rp, rcb_list);
|
|
||||||
#ifdef notdef
|
#ifdef notdef
|
||||||
if (rp->rcb_laddr)
|
if (rp->rcb_laddr)
|
||||||
m_freem(dtom(rp->rcb_laddr));
|
m_freem(dtom(rp->rcb_laddr));
|
||||||
rp->rcb_laddr = 0;
|
rp->rcb_laddr = 0;
|
||||||
#endif
|
#endif
|
||||||
free((void *)rp, M_PCB);
|
free((void *)rp, M_PCB);
|
||||||
|
mutex_enter(softnet_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue