]> git.puffer.fish Git - matthieu/frr.git/commitdiff
vtysh: Ignore `end` when parsing frr.conf
authorDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 20 Jul 2022 19:57:33 +0000 (22:57 +0300)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Thu, 21 Jul 2022 18:17:19 +0000 (18:17 +0000)
If we have `end` at the end of the frr.conf, then we never execute
XFRR_end_configuration command, and start/end markers do not work.

This leads to for example waiting BGP configuration parsing thread to hang,
and the peers are in shutdown state until the timer expires.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
(cherry picked from commit ce2e1a0ed852a6d22385afba7ca44f9ec7f1454e)

vtysh/vtysh.c

index 828d2d73b0fec2a589a416e394c9d0ddb39eaf2b..bd4f0e312e3088b29e748d05b07adf976fdb049a 100644 (file)
@@ -885,10 +885,23 @@ int vtysh_config_from_file(struct vty *vty, FILE *fp)
        int lineno = 0;
        /* once we have an error, we remember & return that */
        int retcode = CMD_SUCCESS;
+       char *vty_buf_copy = XCALLOC(MTYPE_VTYSH_CMD, VTY_BUFSIZ);
+       char *vty_buf_trimmed = NULL;
 
        while (fgets(vty->buf, VTY_BUFSIZ, fp)) {
                lineno++;
 
+               strlcpy(vty_buf_copy, vty->buf, VTY_BUFSIZ);
+               vty_buf_trimmed = trim(vty_buf_copy);
+
+               /*
+                * Ignore the "end" lines, we will generate these where
+                * appropriate, otherwise we never execute
+                * XFRR_end_configuration, and start/end markers do not work.
+                */
+               if (strmatch(vty_buf_trimmed, "end"))
+                       continue;
+
                ret = command_config_read_one_line(vty, &cmd, lineno, 1);
 
                switch (ret) {
@@ -955,6 +968,8 @@ int vtysh_config_from_file(struct vty *vty, FILE *fp)
                }
        }
 
+       XFREE(MTYPE_VTYSH_CMD, vty_buf_copy);
+
        return (retcode);
 }