mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-13 21:10:28 +00:00
Quagga processes should not die if they read an unrecognized line in
their config file Ticket: CM-6738 Reviewed By: Donald and Dinesh Testing Done: <DETAILED DESCRIPTION (REPLACE)>
This commit is contained in:
parent
d6db5772f4
commit
5689fe5fef
@ -2761,11 +2761,12 @@ cmd_execute_command_strict (vector vline, struct vty *vty,
|
||||
return cmd_execute_command_real(vline, FILTER_STRICT, vty, cmd);
|
||||
}
|
||||
|
||||
/* Configration make from file. */
|
||||
/* Configuration make from file. */
|
||||
int
|
||||
config_from_file (struct vty *vty, FILE *fp)
|
||||
{
|
||||
int ret;
|
||||
int ret, error_ret=0;
|
||||
int saved_node;
|
||||
vector vline;
|
||||
|
||||
while (fgets (vty->buf, VTY_BUFSIZ, fp))
|
||||
@ -2778,24 +2779,42 @@ config_from_file (struct vty *vty, FILE *fp)
|
||||
/* Execute configuration command : this is strict match */
|
||||
ret = cmd_execute_command_strict (vline, vty, NULL);
|
||||
|
||||
/* Try again with setting node to CONFIG_NODE */
|
||||
while (ret != CMD_SUCCESS && ret != CMD_WARNING
|
||||
&& ret != CMD_ERR_NOTHING_TODO && vty->node != CONFIG_NODE)
|
||||
{
|
||||
vty->node = node_parent(vty->node);
|
||||
ret = cmd_execute_command_strict (vline, vty, NULL);
|
||||
}
|
||||
// Climb the tree and try the command again at each node
|
||||
if (ret != CMD_SUCCESS && ret != CMD_WARNING &&
|
||||
ret != CMD_ERR_NOTHING_TODO && vty->node != CONFIG_NODE) {
|
||||
|
||||
saved_node = vty->node;
|
||||
|
||||
while (ret != CMD_SUCCESS && ret != CMD_WARNING &&
|
||||
ret != CMD_ERR_NOTHING_TODO && vty->node != CONFIG_NODE) {
|
||||
vty->node = node_parent(vty->node);
|
||||
ret = cmd_execute_command_strict (vline, vty, NULL);
|
||||
}
|
||||
|
||||
// If climbing the tree did not work then ignore the command and
|
||||
// stay at the same node
|
||||
if (ret != CMD_SUCCESS && ret != CMD_WARNING &&
|
||||
ret != CMD_ERR_NOTHING_TODO) {
|
||||
vty->node = saved_node;
|
||||
|
||||
if (!error_ret) {
|
||||
memcpy(vty->error_buf, vty->buf, VTY_BUFSIZ);
|
||||
error_ret = ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cmd_free_strvec (vline);
|
||||
|
||||
if (ret != CMD_SUCCESS && ret != CMD_WARNING
|
||||
&& ret != CMD_ERR_NOTHING_TODO)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (error_ret) {
|
||||
return error_ret;
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
/* Configration from terminal */
|
||||
/* Configuration from terminal */
|
||||
DEFUN (config_terminal,
|
||||
config_terminal_cmd,
|
||||
"configure terminal",
|
||||
|
15
lib/vty.c
15
lib/vty.c
@ -322,6 +322,7 @@ vty_new ()
|
||||
|
||||
new->obuf = buffer_new(0); /* Use default buffer size. */
|
||||
new->buf = XCALLOC (MTYPE_VTY, VTY_BUFSIZ);
|
||||
new->error_buf = XCALLOC (MTYPE_VTY, VTY_BUFSIZ);
|
||||
new->max = VTY_BUFSIZ;
|
||||
|
||||
return new;
|
||||
@ -478,6 +479,7 @@ vty_ensure (struct vty *vty, int length)
|
||||
{
|
||||
vty->max *= 2;
|
||||
vty->buf = XREALLOC (MTYPE_VTY, vty->buf, vty->max);
|
||||
vty->error_buf = XREALLOC (MTYPE_VTY, vty->error_buf, vty->max);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2195,6 +2197,9 @@ vty_close (struct vty *vty)
|
||||
if (vty->buf)
|
||||
XFREE (MTYPE_VTY, vty->buf);
|
||||
|
||||
if (vty->error_buf)
|
||||
XFREE (MTYPE_VTY, vty->error_buf);
|
||||
|
||||
/* Check configure. */
|
||||
vty_config_unlock (vty);
|
||||
|
||||
@ -2243,16 +2248,14 @@ vty_read_file (FILE *confp)
|
||||
switch (ret)
|
||||
{
|
||||
case CMD_ERR_AMBIGUOUS:
|
||||
fprintf (stderr, "Ambiguous command.\n");
|
||||
fprintf (stderr, "\nAmbiguous command.");
|
||||
break;
|
||||
case CMD_ERR_NO_MATCH:
|
||||
fprintf (stderr, "There is no such command.\n");
|
||||
fprintf (stderr, "\nThere is no such command.");
|
||||
break;
|
||||
}
|
||||
fprintf (stderr, "Error occured during reading below line.\n%s\n",
|
||||
vty->buf);
|
||||
vty_close (vty);
|
||||
exit (1);
|
||||
fprintf (stderr, "\nError occured during reading below line.\n%s\n",
|
||||
vty->error_buf);
|
||||
}
|
||||
|
||||
vty_close (vty);
|
||||
|
@ -49,6 +49,9 @@ struct vty
|
||||
/* Command input buffer */
|
||||
char *buf;
|
||||
|
||||
/* Command input error buffer */
|
||||
char *error_buf;
|
||||
|
||||
/* Command cursor point */
|
||||
int cp;
|
||||
|
||||
|
@ -662,7 +662,7 @@ vtysh_mark_file (const char *filename)
|
||||
}
|
||||
|
||||
/* Configration make from file. */
|
||||
int
|
||||
void
|
||||
vtysh_config_from_file (struct vty *vty, FILE *fp)
|
||||
{
|
||||
int ret;
|
||||
@ -707,14 +707,15 @@ vtysh_config_from_file (struct vty *vty, FILE *fp)
|
||||
else
|
||||
{
|
||||
save_node = vty->node;
|
||||
vtysh_execute ("end");
|
||||
vtysh_execute ("configure terminal");
|
||||
vty->node = CONFIG_NODE;
|
||||
ret = cmd_execute_command_strict (vline, vty, &cmd);
|
||||
|
||||
// If the command did not work at CONFIG_NODE either then ignore
|
||||
// the command and go back to our previous node.
|
||||
if ((ret != CMD_SUCCESS) &&
|
||||
(ret != CMD_SUCCESS_DAEMON) &&
|
||||
(ret != CMD_WARNING))
|
||||
vty->node = save_node;
|
||||
vty->node = save_node;
|
||||
}
|
||||
}
|
||||
|
||||
@ -758,7 +759,6 @@ vtysh_config_from_file (struct vty *vty, FILE *fp)
|
||||
}
|
||||
}
|
||||
}
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
/* We don't care about the point of the cursor when '?' is typed. */
|
||||
|
@ -50,7 +50,7 @@ char *vtysh_prompt (void);
|
||||
|
||||
void vtysh_config_write (void);
|
||||
|
||||
int vtysh_config_from_file (struct vty *, FILE *);
|
||||
void vtysh_config_from_file (struct vty *, FILE *);
|
||||
|
||||
int vtysh_mark_file(const char *filename);
|
||||
|
||||
|
@ -368,7 +368,6 @@ vtysh_config_dump (FILE *fp)
|
||||
static void
|
||||
vtysh_read_file (FILE *confp)
|
||||
{
|
||||
int ret;
|
||||
struct vty *vty;
|
||||
|
||||
vty = vty_new ();
|
||||
@ -380,28 +379,12 @@ vtysh_read_file (FILE *confp)
|
||||
vtysh_execute_no_pager ("configure terminal");
|
||||
|
||||
/* Execute configuration file. */
|
||||
ret = vtysh_config_from_file (vty, confp);
|
||||
vtysh_config_from_file (vty, confp);
|
||||
|
||||
vtysh_execute_no_pager ("end");
|
||||
vtysh_execute_no_pager ("disable");
|
||||
|
||||
vty_close (vty);
|
||||
|
||||
if (ret != CMD_SUCCESS)
|
||||
{
|
||||
switch (ret)
|
||||
{
|
||||
case CMD_ERR_AMBIGUOUS:
|
||||
fprintf (stderr, "Ambiguous command.\n");
|
||||
break;
|
||||
case CMD_ERR_NO_MATCH:
|
||||
fprintf (stderr, "There is no such command.\n");
|
||||
break;
|
||||
}
|
||||
fprintf (stderr, "Error occured during reading below line.\n%s\n",
|
||||
vty->buf);
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Read up configuration file from config_default_dir. */
|
||||
|
Loading…
Reference in New Issue
Block a user