]> git.proxmox.com Git - mirror_frr.git/commitdiff
isisd: guard against adj timer display overflow
authorEmanuele Di Pascale <emanuele@voltanet.io>
Wed, 23 Sep 2020 14:46:44 +0000 (16:46 +0200)
committerEmanuele Di Pascale <emanuele@voltanet.io>
Fri, 25 Sep 2020 11:06:57 +0000 (13:06 +0200)
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 <emanuele@voltanet.io>
isisd/isis_adjacency.c

index f0cf93ac4b04161e29813465894e794da7983c9b..5bfbb2cf7e66fc5ca9a4564802ae3c7edae92054 100644 (file)
@@ -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");