From: Donald Sharp Date: Tue, 13 Oct 2020 12:16:15 +0000 (-0400) Subject: ospfd: Prevent crash if transferring config amongst instances X-Git-Tag: base_7.6~421^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=2b0a32da60eca7d5f9f348ed8bd414ff9eabdf5a;p=mirror%2Ffrr.git ospfd: Prevent crash if transferring config amongst instances If we enter: int eth0 ip ospf area 0 ip ospf 10 area 0 ! This will crash ospf. Prevent this from happening. OSPF instances: a) Cannot be mixed with non-instance b) Are their own process. Since in multi-instance world ospf instances are their own process, when an ospf processes receives an instance command we must remove our config( if present ) and allow the new config to be active in the new process. The problem here is that if you have not done a `router ospf` above the lookup of the ospf pointer will fail and we will just crash. Put some code in to prevent a crash in this case. Signed-off-by: Donald Sharp --- diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index 1a9ad69ed3..29ad124116 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -8135,12 +8135,25 @@ DEFUN (ip_ospf_area, ospf = ospf_lookup_instance(instance); if (instance && ospf == NULL) { + /* + * At this point we know we have received + * an instance and there is no ospf instance + * associated with it. This means we are + * in a situation where we have an + * ospf command that is setup for a different + * process(instance). We need to safely + * remove the command from ourselves and + * allow the other instance(process) handle + * the configuration command. + */ params = IF_DEF_PARAMS(ifp); if (OSPF_IF_PARAM_CONFIGURED(params, if_area)) { UNSET_IF_PARAM(params, if_area); ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT); - ospf_interface_area_unset(ospf, ifp); - ospf->if_ospf_cli_count--; + if (ospf) { + ospf_interface_area_unset(ospf, ifp); + ospf->if_ospf_cli_count--; + } } return CMD_NOT_MY_INSTANCE; }