summaryrefslogtreecommitdiff
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
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>
-rw-r--r--ospf6d/ospf6_main.c1
-rw-r--r--ospf6d/ospf6_route.c9
2 files changed, 5 insertions, 5 deletions
diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c
index e582737f94..76c20fa81f 100644
--- a/ospf6d/ospf6_main.c
+++ b/ospf6d/ospf6_main.c
@@ -125,7 +125,6 @@ static void sigint(void)
static void sigterm(void)
{
zlog_notice("Terminating on signal SIGTERM");
- ospf6_clean();
ospf6_exit(0);
}
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);