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 <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2017-02-01 15:33:55 +01:00
parent 46857efe0d
commit d24736fa17

View File

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