From ec21aecfddde3be2b061850a050108265dfbf194 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Thu, 11 May 2000 10:33:18 +0000 Subject: [PATCH] Fixed nasty segfault in rip. --- nest/route.h | 1 + proto/rip/rip.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/nest/route.h b/nest/route.h index 523d3905..fac5b384 100644 --- a/nest/route.h +++ b/nest/route.h @@ -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 diff --git a/proto/rip/rip.c b/proto/rip/rip.c index b277f5c2..d8e00b9e 100644 --- a/proto/rip/rip.c +++ b/proto/rip/rip.c @@ -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;