summaryrefslogtreecommitdiff
path: root/ospf6d/ospf6_route.c
diff options
context:
space:
mode:
authorChirag Shah <chirag@cumulusnetworks.com>2017-10-04 14:31:35 -0700
committerChirag Shah <chirag@cumulusnetworks.com>2017-10-06 10:01:46 -0700
commitdd2395e1c63ff37ec82143e1a8d111e564c7c65e (patch)
tree1eed37ab35c93071fbacf5620f2ff94c065615bb /ospf6d/ospf6_route.c
parent3782fb37b1c480f2a1c3811fb703bdd5981ca60a (diff)
ospf6d: fix ospf6d crash during sigterm/shutdown
During signterm (shutdown) ospf6_clean calls route_remove for brouter_table, during route_remove brouter_table remove hook function is invoked which in turns calls router_remove is any of the LSA has max age or cost is infinity, which leads to stack corruption trying to delete same route node. Similar to 'no router ospf6' or 'no area ..' command where lsdb is cleanedup then brouter route table clean up is called. Clean some of route trace to have route related fields. Ticket:CM-17932 Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
Diffstat (limited to 'ospf6d/ospf6_route.c')
-rw-r--r--ospf6d/ospf6_route.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c
index 5b78dda688..3c77c483ea 100644
--- a/ospf6d/ospf6_route.c
+++ b/ospf6d/ospf6_route.c
@@ -683,9 +683,9 @@ struct ospf6_route *ospf6_route_add(struct ospf6_route *route,
/* Else, this is the brand new route regarding to the prefix */
if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
- zlog_debug("%s %p: route add %p: brand new route",
+ zlog_debug("%s %p: route add %p %s : brand new route",
ospf6_route_table_name(table), (void *)table,
- (void *)route);
+ (void *)route, buf);
else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
zlog_debug("%s: route add: brand new route",
ospf6_route_table_name(table));
@@ -760,9 +760,9 @@ void ospf6_route_remove(struct ospf6_route *route,
prefix2str(&route->prefix, buf, sizeof(buf));
if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
- zlog_debug("%s %p: route remove %p: %s rnode refcount %u",
+ zlog_debug("%s %p: route remove %p: %s refcount %u",
ospf6_route_table_name(table), (void *)table,
- (void *)route, buf, route->rnode->lock);
+ (void *)route, buf, route->lock);
else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
zlog_debug("%s: route remove: %s",
ospf6_route_table_name(table), buf);
@@ -801,6 +801,7 @@ void ospf6_route_remove(struct ospf6_route *route,
SET_FLAG(route->flag, OSPF6_ROUTE_WAS_REMOVED);
+ /* Note hook_remove may call ospf6_route_remove */
if (table->hook_remove)
(*table->hook_remove)(route);