diff options
author | Dmitrij Tejblum <tejblum@yandex-team.ru> | 2011-01-13 18:25:40 +0300 |
---|---|---|
committer | Denis Ovsienko <infrastation@yandex.ru> | 2011-01-13 18:25:40 +0300 |
commit | 403138e189c24f6867824c4eeb668d11564e1ca0 (patch) | |
tree | 436c9c428ad21fe1718ad083c790c1bf7d077f52 | |
parent | b729294c8c5c6f2af8ddf6cfbea2374b6faabe9d (diff) |
ospf6d: fix crash in SPF calculation
* ospf6_spf.c: Don't replace a node with another node with a lower
number of hops, instead get them from the queue in the correct
order. (Actually, the replacement crashed the ospf6d daemon
rather than worked.)
-rw-r--r-- | ospf6d/ospf6_spf.c | 22 |
1 files changed, 5 insertions, 17 deletions
diff --git a/ospf6d/ospf6_spf.c b/ospf6d/ospf6_spf.c index bfb6df2e..04367f08 100644 --- a/ospf6d/ospf6_spf.c +++ b/ospf6d/ospf6_spf.c @@ -50,7 +50,9 @@ ospf6_vertex_cmp (void *a, void *b) struct ospf6_vertex *vb = (struct ospf6_vertex *) b; /* ascending order */ - return (va->cost - vb->cost); + if (va->cost != vb->cost) + return (va->cost - vb->cost); + return (va->hops - vb->hops); } static int @@ -320,22 +322,8 @@ ospf6_spf_install (struct ospf6_vertex *v, } prev = (struct ospf6_vertex *) route->route_option; - if (prev->hops > v->hops) - { - for (ALL_LIST_ELEMENTS (prev->child_list, node, nnode, w)) - { - assert (w->parent == prev); - w->parent = v; - listnode_add_sort (v->child_list, w); - } - listnode_delete (prev->parent->child_list, prev); - listnode_add_sort (v->parent->child_list, v); - - ospf6_vertex_delete (prev); - route->route_option = v; - } - else - ospf6_vertex_delete (v); + assert (prev->hops <= v->hops); + ospf6_vertex_delete (v); return -1; } |