summaryrefslogtreecommitdiff
path: root/ospfd/ospf_spf.c
diff options
context:
space:
mode:
authorpaul <paul>2005-11-11 12:10:03 +0000
committerpaul <paul>2005-11-11 12:10:03 +0000
commit58e1befe5fbd6eade52a1536acb49ea4b4fc5837 (patch)
tree3851ffdb632c5e8d6ea6e8ed77cee7fb6c21b013 /ospfd/ospf_spf.c
parentcb3d31db278a522641f2ec5408034b819091bab6 (diff)
[ospfd] SPF ospf_canonical_nexthops_free bugfix.
Diffstat (limited to 'ospfd/ospf_spf.c')
-rw-r--r--ospfd/ospf_spf.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c
index 564ae847..dbd06361 100644
--- a/ospfd/ospf_spf.c
+++ b/ospfd/ospf_spf.c
@@ -94,11 +94,20 @@ ospf_canonical_nexthops_free (struct vertex *root)
struct listnode *n2, *nn2;
struct vertex_parent *vp;
+ /* router vertices through an attached network each
+ * have a distinct (canonical / not inherited) nexthop
+ * which must be freed.
+ *
+ * A network vertex can only have router vertices as its
+ * children, so only one level of recursion is possible.
+ */
if (child->type == OSPF_VERTEX_NETWORK)
ospf_canonical_nexthops_free (child);
+ /* Free child nexthops pointing back to this root vertex */
for (ALL_LIST_ELEMENTS (child->parents, n2, nn2, vp))
- vertex_nexthop_free (vp->nexthop);
+ if (vp->parent == root)
+ vertex_nexthop_free (vp->nexthop);
}
}