]> git.proxmox.com Git - mirror_frr.git/commitdiff
isisd: fix some crashes with --tcli
authorRenato Westphal <renato@opensourcerouting.org>
Fri, 6 Nov 2020 13:02:16 +0000 (10:02 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Mon, 23 Nov 2020 18:22:36 +0000 (15:22 -0300)
The "ifp" variable returned by nb_running_get_entry() might be
NULL when using the transactional CLI mode. Make the required
modifications to avoid null pointer dereferences.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
isisd/isis_cli.c

index 203fa8eb8d6465e66d0e6b729c336f03a5e563d9..6c6d88ad538765e036dc77e57dde26d18f5cf97a 100644 (file)
@@ -170,15 +170,19 @@ DEFPY_YANG(ip_router_isis, ip_router_isis_cmd,
                return CMD_SUCCESS;
        }
        ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false);
-
-       if (!vrf_name && ifp->vrf_id == VRF_DEFAULT)
-               vrf_name = VRF_DEFAULT_NAME;
-
-       if (ifp->vrf_id != VRF_DEFAULT) {
-               vrf = vrf_lookup_by_id(ifp->vrf_id);
-               if (vrf && !vrf_name)
-                       vrf_name = vrf->name;
+       if (!vrf_name) {
+               if (ifp) {
+                       if (ifp->vrf_id == VRF_DEFAULT)
+                               vrf_name = VRF_DEFAULT_NAME;
+                       else {
+                               vrf = vrf_lookup_by_id(ifp->vrf_id);
+                               if (vrf && !vrf_name)
+                                       vrf_name = vrf->name;
+                       }
+               } else
+                       vrf_name = VRF_DEFAULT_NAME;
        }
+
        area = isis_area_lookup_by_vrf(tag, vrf_name);
        if (!area) {
                isis_global_instance_create(vrf_name);
@@ -235,7 +239,7 @@ DEFPY_YANG(ip_router_isis, ip_router_isis_cmd,
        }
 
        /* check if the interface is a loopback and if so set it as passive */
-       if (if_is_loopback(ifp))
+       if (ifp && if_is_loopback(ifp))
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive",
                                      NB_OP_MODIFY, "true");
 
@@ -263,14 +267,19 @@ DEFPY_YANG(ip6_router_isis, ip6_router_isis_cmd,
                return CMD_SUCCESS;
 
        ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false);
-       if (!vrf_name && ifp->vrf_id == VRF_DEFAULT)
-               vrf_name = VRF_DEFAULT_NAME;
-
-       if (ifp->vrf_id != VRF_DEFAULT) {
-               vrf = vrf_lookup_by_id(ifp->vrf_id);
-               if (vrf && !vrf_name)
-                       vrf_name = vrf->name;
+       if (!vrf_name) {
+               if (ifp) {
+                       if (ifp->vrf_id == VRF_DEFAULT)
+                               vrf_name = VRF_DEFAULT_NAME;
+                       else {
+                               vrf = vrf_lookup_by_id(ifp->vrf_id);
+                               if (vrf && !vrf_name)
+                                       vrf_name = vrf->name;
+                       }
+               } else
+                       vrf_name = VRF_DEFAULT_NAME;
        }
+
        area = isis_area_lookup_by_vrf(tag, vrf_name);
        if (!area) {
                isis_global_instance_create(vrf_name);
@@ -326,7 +335,7 @@ DEFPY_YANG(ip6_router_isis, ip6_router_isis_cmd,
        }
 
        /* check if the interface is a loopback and if so set it as passive */
-       if (if_is_loopback(ifp))
+       if (ifp && if_is_loopback(ifp))
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive",
                                      NB_OP_MODIFY, "true");