From 0e95e0785778f3e424d3d6a58671aa9cd2cc96cf Mon Sep 17 00:00:00 2001 From: Emanuele Di Pascale Date: Wed, 23 Sep 2020 16:46:44 +0200 Subject: [PATCH] isisd: guard against adj timer display overflow An adjacency should be removed when the holdtimer expires, but if the system is overloaded we may end up doing it late. In the meanwhile vtysh will display an incorrect value in the show isis neighbor output, due to an overflow of the unsigned variable used to display the Holdtime, e.g.: pe1# show isis neighbor Area test: System Id Interface L state Holdtime SNPA Spirent-1 2.201 1 Down 26 2020.2020.2020 Spirent-1 2.203 1 Up 21 2020.2020.2020 Spirent-1 2.204 1 Up 18446744073709551615 2020.2020.2020 Spirent-1 2.207 1 Up 18446744073709551615 2020.2020.2020 Spirent-1 2.208 1 Up 18446744073709551615 2020.2020.2020 Spirent-1 2.209 1 Up 0 2020.2020.2020 Spirent-1 2.210 1 Up 18446744073709551615 2020.2020.2020 pe2 12.200 1 Up 30 2020.2020.2020 Guard against that by printing an "Expiring" message instead. Signed-off-by: Emanuele Di Pascale --- isisd/isis_adjacency.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index f0cf93ac4b..5bfbb2cf7e 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -465,11 +465,15 @@ void isis_adj_print_vty(struct isis_adjacency *adj, struct vty *vty, vty_out(vty, "%-3u", adj->level); /* level */ vty_out(vty, "%-13s", adj_state2string(adj->adj_state)); now = time(NULL); - if (adj->last_upd) - vty_out(vty, "%-9llu", - (unsigned long long)adj->last_upd - + adj->hold_time - now); - else + if (adj->last_upd) { + if (adj->last_upd + adj->hold_time + < (unsigned long long)now) + vty_out(vty, " Expiring"); + else + vty_out(vty, " %-9llu", + (unsigned long long)adj->last_upd + + adj->hold_time - now); + } else vty_out(vty, "- "); vty_out(vty, "%-10s", snpa_print(adj->snpa)); vty_out(vty, "\n"); @@ -489,11 +493,15 @@ void isis_adj_print_vty(struct isis_adjacency *adj, struct vty *vty, vty_out(vty, ", Level: %u", adj->level); /* level */ vty_out(vty, ", State: %s", adj_state2string(adj->adj_state)); now = time(NULL); - if (adj->last_upd) - vty_out(vty, ", Expires in %s", - time2string(adj->last_upd + adj->hold_time - - now)); - else + if (adj->last_upd) { + if (adj->last_upd + adj->hold_time + < (unsigned long long)now) + vty_out(vty, " Expiring"); + else + vty_out(vty, ", Expires in %s", + time2string(adj->last_upd + + adj->hold_time - now)); + } else vty_out(vty, ", Expires in %s", time2string(adj->hold_time)); vty_out(vty, "\n"); -- 2.39.5