From dd2395e1c63ff37ec82143e1a8d111e564c7c65e Mon Sep 17 00:00:00 2001 From: Chirag Shah Date: Wed, 4 Oct 2017 14:31:35 -0700 Subject: [PATCH] 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 --- ospf6d/ospf6_main.c | 1 - ospf6d/ospf6_route.c | 9 +++++---- 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);