From d24736fa17f9970dd58c5e6417bf3a5444011f5e Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Wed, 1 Feb 2017 15:33:55 +0100 Subject: [PATCH] zebra: fix SEGV on exit or vrf delete table->info must be free'd last, it's used in rib_unlink(). Signed-off-by: David Lamparter --- zebra/zebra_vrf.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c index b1c5e4dd35..4715f6e12c 100644 --- a/zebra/zebra_vrf.c +++ b/zebra/zebra_vrf.c @@ -217,6 +217,7 @@ zebra_vrf_delete (struct vrf *vrf) { struct zebra_vrf *zvrf = vrf->info; struct route_table *table; + rib_table_info_t *info; u_int32_t table_id; afi_t afi; safi_t safi; @@ -273,8 +274,9 @@ zebra_vrf_delete (struct vrf *vrf) for (safi = SAFI_UNICAST; safi <= SAFI_MULTICAST; safi++) { table = zvrf->table[afi][safi]; - XFREE (MTYPE_RIB_TABLE_INFO, table->info); + info = table->info; route_table_finish (table); + XFREE (MTYPE_RIB_TABLE_INFO, info); table = zvrf->stable[afi][safi]; route_table_finish (table); @@ -284,8 +286,9 @@ zebra_vrf_delete (struct vrf *vrf) if (zvrf->other_table[afi][table_id]) { table = zvrf->other_table[afi][table_id]; - XFREE (MTYPE_RIB_TABLE_INFO, table->info); + info = table->info; route_table_finish (table); + XFREE (MTYPE_RIB_TABLE_INFO, info); } route_table_finish (zvrf->rnh_table[afi]);