diff options
author | Pavel Machek <pavel@ucw.cz> | 2000-05-11 12:33:18 +0200 |
---|---|---|
committer | Pavel Machek <pavel@ucw.cz> | 2000-05-11 12:33:18 +0200 |
commit | ec21aecfddde3be2b061850a050108265dfbf194 (patch) | |
tree | 9534b056e656cc9ea24726ede0675f4f036d929f | |
parent | 10f5c47d2e3d9fdeb2dd4ade1d09a1e06b53a7f6 (diff) | |
download | bird-ec21aecfddde3be2b061850a050108265dfbf194.tar bird-ec21aecfddde3be2b061850a050108265dfbf194.zip |
Fixed nasty segfault in rip.
-rw-r--r-- | nest/route.h | 1 | ||||
-rw-r--r-- | proto/rip/rip.c | 12 |
2 files changed, 11 insertions, 2 deletions
diff --git a/nest/route.h b/nest/route.h index 523d390..fac5b38 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 b277f5c..d8e00b9 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; |