From 472c3dae39776873a018efa63cdfae634c072193 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Wed, 20 Feb 2019 15:36:50 -0300 Subject: [PATCH] isisd: fix crash when entering "no ip[v6] router isis" twice isisd CLI has some housekeeping code that removes the "frr-isisd:isis" container from the interface configuration when IS-IS is disabled for both IPv4 and IPv6 in the corresponding interface. The problem is that the code was checking the values of the "ipv4-routing" and "ipv6-routing" leafs without checking if the parent "frr-isisd:isis" container was present. So, entering "no ip[v6] router isis" twice would cause isisd to crash since the "frr-isisd:isis" container wouldn't be present the second time the command is processed. Fix this. isisd aborted: vtysh -c "configure terminal" -c "interface eth99" -c "no ip router isis WORD" isisd aborted: vtysh -c "configure terminal" -c "interface eth99" -c "no ipv6 router isis" Signed-off-by: Renato Westphal --- isisd/isis_cli.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index bd8b58e8f0..ab5faf76b6 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -279,25 +279,26 @@ DEFPY(no_ip_router_isis, no_ip_router_isis_cmd, "IS-IS routing protocol\n" "Routing process tag\n") { - const struct lyd_node *dnode = - yang_dnode_get(running_config->dnode, VTY_CURR_XPATH); + const struct lyd_node *dnode; - /* if both ipv4 and ipv6 are off delete the interface isis container too + dnode = yang_dnode_get(vty->candidate_config->dnode, + "%s/frr-isisd:isis", VTY_CURR_XPATH); + if (!dnode) + return CMD_SUCCESS; + + /* + * If both ipv4 and ipv6 are off delete the interface isis container. */ - if (!strncmp(ip, "ipv6", strlen("ipv6"))) { - if (dnode - && !yang_dnode_get_bool(dnode, - "./frr-isisd:isis/ipv4-routing")) + if (strmatch(ip, "ipv6")) { + if (!yang_dnode_get_bool(dnode, "./ipv4-routing")) nb_cli_enqueue_change(vty, "./frr-isisd:isis", NB_OP_DESTROY, NULL); else nb_cli_enqueue_change(vty, "./frr-isisd:isis/ipv6-routing", NB_OP_MODIFY, "false"); - } else { /* no ipv4 */ - if (dnode - && !yang_dnode_get_bool(dnode, - "./frr-isisd:isis/ipv6-routing")) + } else { + if (!yang_dnode_get_bool(dnode, "./ipv6-routing")) nb_cli_enqueue_change(vty, "./frr-isisd:isis", NB_OP_DESTROY, NULL); else -- 2.39.5