diff options
author | Pavel Machek <pavel@ucw.cz> | 2000-05-11 10:33:18 +0000 |
---|---|---|
committer | Pavel Machek <pavel@ucw.cz> | 2000-05-11 10:33:18 +0000 |
commit | ec21aecfddde3be2b061850a050108265dfbf194 (patch) | |
tree | 9534b056e656cc9ea24726ede0675f4f036d929f /proto/rip | |
parent | 10f5c47d2e3d9fdeb2dd4ade1d09a1e06b53a7f6 (diff) |
Fixed nasty segfault in rip.
Diffstat (limited to 'proto/rip')
-rw-r--r-- | proto/rip/rip.c | 12 |
1 files changed, 10 insertions, 2 deletions
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; |