From dcc3ef8723928fd1bc652eb63af5a8cf5eb63d92 Mon Sep 17 00:00:00 2001 From: Chirag Shah Date: Mon, 2 Oct 2017 14:07:13 -0700 Subject: [PATCH] ospfd: Fix maxage_lsa lookup key maxage_lsa using prefix structure to store in route_table. The lsa pointer is 4-8 bytes depending on arch, but prefix member field would be 1 byte. Use ptr field of prefix structure to store lsa pointer. Also memset to initialize to avoid crash on ARM platform as same LSA is referenced from multiple times during shutdown of ospf. Signed-off-by: Chirag Shah --- ospfd/ospf_lsa.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c index 68adf2e10b..fa13843764 100644 --- a/ospfd/ospf_lsa.c +++ b/ospfd/ospf_lsa.c @@ -2844,11 +2844,12 @@ static int ospf_maxage_lsa_remover(struct thread *thread) void ospf_lsa_maxage_delete(struct ospf *ospf, struct ospf_lsa *lsa) { struct route_node *rn; - struct prefix_ptr lsa_prefix; + struct prefix lsa_prefix; + memset(&lsa_prefix, 0, sizeof(struct prefix)); lsa_prefix.family = 0; - lsa_prefix.prefixlen = sizeof(lsa_prefix.prefix) * CHAR_BIT; - lsa_prefix.prefix = (uintptr_t)lsa; + lsa_prefix.prefixlen = sizeof(lsa_prefix.u.ptr) * CHAR_BIT; + lsa_prefix.u.ptr = (uintptr_t)lsa; if ((rn = route_node_lookup(ospf->maxage_lsa, (struct prefix *)&lsa_prefix))) { @@ -2860,6 +2861,10 @@ void ospf_lsa_maxage_delete(struct ospf *ospf, struct ospf_lsa *lsa) rn); /* unlock node because lsa is deleted */ } route_unlock_node(rn); /* route_node_lookup */ + } else { + if (IS_DEBUG_OSPF_EVENT) + zlog_debug("%s: lsa %s is not found in maxage db.", + __PRETTY_FUNCTION__, dump_lsa_key(lsa)); } } @@ -2870,7 +2875,7 @@ void ospf_lsa_maxage_delete(struct ospf *ospf, struct ospf_lsa *lsa) */ void ospf_lsa_maxage(struct ospf *ospf, struct ospf_lsa *lsa) { - struct prefix_ptr lsa_prefix; + struct prefix lsa_prefix; struct route_node *rn; /* When we saw a MaxAge LSA flooded to us, we put it on the list @@ -2884,9 +2889,10 @@ void ospf_lsa_maxage(struct ospf *ospf, struct ospf_lsa *lsa) return; } + memset(&lsa_prefix, 0, sizeof(struct prefix)); lsa_prefix.family = 0; - lsa_prefix.prefixlen = sizeof(lsa_prefix.prefix) * CHAR_BIT; - lsa_prefix.prefix = (uintptr_t)lsa; + lsa_prefix.prefixlen = sizeof(lsa_prefix.u.ptr) * CHAR_BIT; + lsa_prefix.u.ptr = (uintptr_t)lsa; if ((rn = route_node_get(ospf->maxage_lsa, (struct prefix *)&lsa_prefix)) @@ -2903,7 +2909,8 @@ void ospf_lsa_maxage(struct ospf *ospf, struct ospf_lsa *lsa) SET_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE); } } else { - zlog_err("Unable to allocate memory for maxage lsa\n"); + zlog_err("Unable to allocate memory for maxage lsa %s\n", + dump_lsa_key(lsa)); assert(0); } -- 2.39.5