summaryrefslogtreecommitdiffstats
path: root/proto
diff options
context:
space:
mode:
authorPavel Machek <pavel@ucw.cz>2000-05-11 12:33:18 +0200
committerPavel Machek <pavel@ucw.cz>2000-05-11 12:33:18 +0200
commitec21aecfddde3be2b061850a050108265dfbf194 (patch)
tree9534b056e656cc9ea24726ede0675f4f036d929f /proto
parent10f5c47d2e3d9fdeb2dd4ade1d09a1e06b53a7f6 (diff)
downloadbird-ec21aecfddde3be2b061850a050108265dfbf194.tar
bird-ec21aecfddde3be2b061850a050108265dfbf194.zip
Fixed nasty segfault in rip.
Diffstat (limited to 'proto')
-rw-r--r--proto/rip/rip.c12
1 files changed, 10 insertions, 2 deletions
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;