summaryrefslogtreecommitdiff
path: root/ospf6d
diff options
context:
space:
mode:
authorTom Goff <thomas.goff@boeing.com>2010-11-10 13:02:38 -0800
committerPaul Jakma <paul@quagga.net>2011-03-21 13:31:16 +0000
commit1d19234e79c77a7d55194b513f2a77c6a691bc2c (patch)
tree4daf54c79e1cc3c3c6fa3ca66cfccb68770b3dd1 /ospf6d
parent7e69d993673597334b1e1b3d1072a4c064f293d5 (diff)
ospf6d: Fix memory allocation issues in SPF
* ospf6_area.c: Call ospf6_spf_table_finish() before deleting the spf table. This ensures that the associated ospf6_vertex structures are also freed. * ospf6_spf.c: Only allocate a priority queue when a spf calculation is actually performed. Also defer calling ospf6_spf_table_finish().
Diffstat (limited to 'ospf6d')
-rw-r--r--ospf6d/ospf6_area.c1
-rw-r--r--ospf6d/ospf6_spf.c13
2 files changed, 8 insertions, 6 deletions
diff --git a/ospf6d/ospf6_area.c b/ospf6d/ospf6_area.c
index 3c999bbc..bf8dbc33 100644
--- a/ospf6d/ospf6_area.c
+++ b/ospf6d/ospf6_area.c
@@ -199,6 +199,7 @@ ospf6_area_delete (struct ospf6_area *oa)
ospf6_lsdb_delete (oa->lsdb);
ospf6_lsdb_delete (oa->lsdb_self);
+ ospf6_spf_table_finish (oa->spf_table);
ospf6_route_table_delete (oa->spf_table);
ospf6_route_table_delete (oa->route_table);
diff --git a/ospf6d/ospf6_spf.c b/ospf6d/ospf6_spf.c
index 04367f08..cb549618 100644
--- a/ospf6d/ospf6_spf.c
+++ b/ospf6d/ospf6_spf.c
@@ -392,18 +392,19 @@ ospf6_spf_calculation (u_int32_t router_id,
caddr_t lsdesc;
struct ospf6_lsa *lsa;
- /* initialize */
- candidate_list = pqueue_create ();
- candidate_list->cmp = ospf6_vertex_cmp;
-
- ospf6_spf_table_finish (result_table);
-
/* Install the calculating router itself as the root of the SPF tree */
/* construct root vertex */
lsa = ospf6_lsdb_lookup (htons (OSPF6_LSTYPE_ROUTER), htonl (0),
router_id, oa->lsdb);
if (lsa == NULL)
return;
+
+ /* initialize */
+ candidate_list = pqueue_create ();
+ candidate_list->cmp = ospf6_vertex_cmp;
+
+ ospf6_spf_table_finish (result_table);
+
root = ospf6_vertex_create (lsa);
root->area = oa;
root->cost = 0;