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>
This commit is contained in:
Chirag Shah 2017-10-04 14:31:35 -07:00
parent 3782fb37b1
commit dd2395e1c6
2 changed files with 5 additions and 5 deletions

View file

@ -125,7 +125,6 @@ static void sigint(void)
static void sigterm(void)
{
zlog_notice("Terminating on signal SIGTERM");
ospf6_clean();
ospf6_exit(0);
}

View file

@ -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);