summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2010-03-28 06:51:50 +0000
committerbz <bz@FreeBSD.org>2010-03-28 06:51:50 +0000
commitcb7afff0b8e3e70dd6ec8433f046113b67df2f77 (patch)
tree64a811fa14e90b43d84b8b1cb840c407273800bb
parent5271b37f109686cdc404ab64d88ddadd23f67404 (diff)
downloadFreeBSD-src-cb7afff0b8e3e70dd6ec8433f046113b67df2f77.zip
FreeBSD-src-cb7afff0b8e3e70dd6ec8433f046113b67df2f77.tar.gz
When tearing down IPsec as part of a (virtual) network stack,
do not try to free the same list twice but free both the acquiring list and the security policy acquiring list. Reviewed by: anchie MFC after: 3 days
-rw-r--r--sys/netipsec/key.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/sys/netipsec/key.c b/sys/netipsec/key.c
index c5aa4b7..e3a61ac 100644
--- a/sys/netipsec/key.c
+++ b/sys/netipsec/key.c
@@ -7779,7 +7779,8 @@ void
key_destroy(void)
{
struct secpolicy *sp, *nextsp;
- struct secspacq *acq, *nextacq;
+ struct secacq *acq, *nextacq;
+ struct secspacq *spacq, *nextspacq;
struct secashead *sah, *nextsah;
struct secreg *reg;
int i;
@@ -7820,7 +7821,7 @@ key_destroy(void)
REGTREE_UNLOCK();
ACQ_LOCK();
- for (acq = LIST_FIRST(&V_spacqtree); acq != NULL; acq = nextacq) {
+ for (acq = LIST_FIRST(&V_acqtree); acq != NULL; acq = nextacq) {
nextacq = LIST_NEXT(acq, chain);
if (__LIST_CHAINED(acq)) {
LIST_REMOVE(acq, chain);
@@ -7830,11 +7831,12 @@ key_destroy(void)
ACQ_UNLOCK();
SPACQ_LOCK();
- for (acq = LIST_FIRST(&V_spacqtree); acq != NULL; acq = nextacq) {
- nextacq = LIST_NEXT(acq, chain);
- if (__LIST_CHAINED(acq)) {
- LIST_REMOVE(acq, chain);
- free(acq, M_IPSEC_SAQ);
+ for (spacq = LIST_FIRST(&V_spacqtree); spacq != NULL;
+ spacq = nextspacq) {
+ nextspacq = LIST_NEXT(spacq, chain);
+ if (__LIST_CHAINED(spacq)) {
+ LIST_REMOVE(spacq, chain);
+ free(spacq, M_IPSEC_SAQ);
}
}
SPACQ_UNLOCK();
OpenPOWER on IntegriCloud