]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixed nasty segfault in rip.
authorPavel Machek <pavel@ucw.cz>
Thu, 11 May 2000 10:33:18 +0000 (10:33 +0000)
committerPavel Machek <pavel@ucw.cz>
Thu, 11 May 2000 10:33:18 +0000 (10:33 +0000)
nest/route.h
proto/rip/rip.c

index 523d3905bd87a83c7e8ca29cbc871143b7ad2e3a..fac5b3848fc2041afbac0f731d6c56a727cf39c7 100644 (file)
@@ -155,6 +155,7 @@ typedef struct rte {
       byte metric;                     /* RIP metric */
       u16 tag;                         /* External route tag */
       bird_clock_t lastmodX;           /* Strange kind of last modification time */
+      struct rip_entry *entry;
     } rip;
 #endif
 #ifdef CONFIG_OSPF
index b277f5c2d4cd12c81239c6a1700ca9c51a0eefc7..d8e00b9e707adf9edfd502002937b938d90aff7b 100644 (file)
@@ -298,6 +298,7 @@ advertise_entry( struct proto *p, struct rip_block *b, ip_addr whotoldme )
   n = net_get( p->table, b->network, pxlen );
   r = rte_get_temp(a);
   r->u.rip.metric = ntohl(b->metric) + rif->metric;
+  r->u.rip.entry = NULL;
   if (r->u.rip.metric > P_CF->infinity) r->u.rip.metric = P_CF->infinity;
   r->u.rip.tag = ntohl(b->tag);
   r->net = n;
@@ -438,7 +439,7 @@ static void
 rip_timer(timer *t)
 {
   struct proto *p = t->data;
-  struct rip_entry *e, *et;
+  struct fib_node *e, *et;
 
   CHK_MAGIC;
   DBG( "RIP: tick tock\n" );
@@ -456,7 +457,10 @@ rip_timer(timer *t)
 
     if (now - rte->u.rip.lastmodX > P_CF->timeout_time) {
       TRACE(D_EVENTS, "RIP: entry is too old: %I", rte->net->n.prefix );
-      e->metric = P_CF->infinity;
+      if (rte->u.rip.entry) {
+       rte->u.rip.entry->metric = P_CF->infinity;
+       rte->u.rip.metric = P_CF->infinity;
+      }
     }
 
     if (now - rte->u.rip.lastmodX > P_CF->garbage_time) {
@@ -772,6 +776,7 @@ rip_rt_notify(struct proto *p, struct network *net, struct rte *new, struct rte
     e->nexthop = new->attrs->gw;
     e->metric = 0;
     e->whotoldme = IPA_NONE;
+    new->u.rip.entry = e;
 
     e->tag = ea_get_int(attrs, EA_RIP_TAG, 0);
     e->metric = ea_get_int(attrs, EA_RIP_METRIC, 1);
@@ -880,6 +885,9 @@ rip_reconfigure(struct proto *p, struct proto_config *c)
   struct rip_proto_config *new = (struct rip_proto_config *) c;
   int generic = sizeof(struct proto_config) + sizeof(list) /* + sizeof(struct password_item *) */;
 
+  /* FIXME: patt_same needed */
+  return 0;
+
   if (!password_same(P_CF->passwords, 
                     new->passwords))
     return 0;