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
This commit is contained in:
Bjoern A. Zeeb 2010-03-28 06:51:50 +00:00
parent 3905e20898
commit 8b7893b056
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=205789

View File

@ -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();