]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: don't crash when isis_sock_init fails 2673/head
authorChristian Franke <chris@opensourcerouting.org>
Tue, 17 Jul 2018 19:14:54 +0000 (15:14 -0400)
committerChristian Franke <chris@opensourcerouting.org>
Thu, 19 Jul 2018 13:57:35 +0000 (09:57 -0400)
When isis_sock_init fails in isis_circuit_up, isis_circuit_down would
be called to cancel timers which were scheduled. However
isis_circuit_down would immediately return, since the state had not been
changed to 'UP' yet.

Fix this by having isis_circuit_down always cancel all the timers.

Signed-off-by: Christian Franke <chris@opensourcerouting.org>
isisd/isis_circuit.c

index 6f4d72cb1fe067ce84bc0fa323bd1c9f56948fb7..41723f7316bba9bca5c5c70f0b0e1917788ac983 100644 (file)
@@ -638,7 +638,7 @@ int isis_circuit_up(struct isis_circuit *circuit)
                        thread_add_timer(master, isis_run_dr_l2, circuit,
                                         2 * circuit->hello_interval[1],
                                         &circuit->u.bc.t_run_dr[1]);
-       } else {
+       } else if (circuit->circ_type == CIRCUIT_T_P2P) {
                /* initializing the hello send threads
                 * for a ptp IF
                 */
@@ -682,9 +682,6 @@ int isis_circuit_up(struct isis_circuit *circuit)
 
 void isis_circuit_down(struct isis_circuit *circuit)
 {
-       if (circuit->state != C_STATE_UP)
-               return;
-
        /* Clear the flags for all the lsps of the circuit. */
        isis_circuit_update_all_srmflags(circuit, 0);
 
@@ -756,10 +753,12 @@ void isis_circuit_down(struct isis_circuit *circuit)
        }
 
        /* send one gratuitous hello to spead up convergence */
-       if (circuit->is_type & IS_LEVEL_1)
-               send_hello(circuit, IS_LEVEL_1);
-       if (circuit->is_type & IS_LEVEL_2)
-               send_hello(circuit, IS_LEVEL_2);
+       if (circuit->state == C_STATE_UP) {
+               if (circuit->is_type & IS_LEVEL_1)
+                       send_hello(circuit, IS_LEVEL_1);
+               if (circuit->is_type & IS_LEVEL_2)
+                       send_hello(circuit, IS_LEVEL_2);
+       }
 
        circuit->upadjcount[0] = 0;
        circuit->upadjcount[1] = 0;