]> git.proxmox.com Git - mirror_frr.git/commitdiff
ospf6d: fix crash in SPF calculation
authorDmitrij Tejblum <tejblum@yandex-team.ru>
Thu, 13 Jan 2011 15:25:40 +0000 (18:25 +0300)
committerDenis Ovsienko <infrastation@yandex.ru>
Thu, 13 Jan 2011 15:25:40 +0000 (18:25 +0300)
* 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.)

ospf6d/ospf6_spf.c

index bfb6df2ee5850e454d9320d92b43222c23df4dec..04367f083773e0b1ea7530cc38ce4c6a78c11918 100644 (file)
@@ -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;
     }