]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Fix bug in prefix trie lookup
authorPaul Jakma <paul@quagga.net>
Tue, 13 Apr 2010 21:42:33 +0000 (22:42 +0100)
committerPaul Jakma <paul@quagga.net>
Wed, 8 Dec 2010 17:06:12 +0000 (17:06 +0000)
* lib/table.c: (route_node_match) fix overshoot that was causing this
  function to go 1 bit too far and thus reading past end of prefix.
  (route_node_lookup) be defensive - don't assume others will clean up
  leaves when removing info.

lib/table.c

index 04df3af5793ccc8094af4d64f5b9e3497767c4c4..e40e67072251edbd497071c6a046beda63e6dca8 100644 (file)
@@ -209,6 +209,10 @@ route_node_match (const struct route_table *table, const struct prefix *p)
     {
       if (node->info)
        matched = node;
+      
+      if (node->p.prefixlen == p->prefixlen)
+        break;
+      
       node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }
 
@@ -260,8 +264,8 @@ route_node_lookup (struct route_table *table, struct prefix *p)
   while (node && node->p.prefixlen <= p->prefixlen && 
         prefix_match (&node->p, p))
     {
-      if (node->p.prefixlen == p->prefixlen && node->info)
-       return route_lock_node (node);
+      if (node->p.prefixlen == p->prefixlen)
+        return node->info ? route_lock_node (node) : NULL;
 
       node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }
@@ -283,10 +287,8 @@ route_node_get (struct route_table *table, struct prefix *p)
         prefix_match (&node->p, p))
     {
       if (node->p.prefixlen == p->prefixlen)
-       {
-         route_lock_node (node);
-         return node;
-       }
+        return route_lock_node (node);
+      
       match = node;
       node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }