From 74542d730198a37a872b7114643e29e99c551bcf Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Mon, 10 Jul 2006 18:09:42 +0000 Subject: [lib] Fix infinite recursion for errors on vtys with terminal monitor enabled 2006-07-10 Andrew J. Schorr * vty.c: (vty_log_out, vty_read, vty_flush, vtysh_flush, vtysh_read) After an I/O error, must set vty->monitor to 0 before calling zlog_warn, otherwise an infinite recursion could occur (since zlog_warn triggers a message to be written to the vty, and that in turn triggers another error message when it fails, etc.). --- lib/ChangeLog | 8 ++++++++ lib/vty.c | 5 +++++ 2 files changed, 13 insertions(+) (limited to 'lib') diff --git a/lib/ChangeLog b/lib/ChangeLog index e95e2a3a..25df2657 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,11 @@ +2006-07-10 Andrew J. Schorr + + * vty.c: (vty_log_out, vty_read, vty_flush, vtysh_flush, vtysh_read) + After an I/O error, must set vty->monitor to 0 before calling + zlog_warn, otherwise an infinite recursion could occur + (since zlog_warn triggers a message to be written to the vty, + and that in turn triggers another error message when it fails, etc.). + 2006-07-03 Andrew J. Schorr * vty.c: (vty_log_out) Debug messages to terminal vty sessions diff --git a/lib/vty.c b/lib/vty.c index 8de32870..98e75060 100644 --- a/lib/vty.c +++ b/lib/vty.c @@ -182,6 +182,7 @@ vty_log_out (struct vty *vty, const char *level, const char *proto_str, drop the data and ignore. */ return -1; /* Fatal I/O error. */ + vty->monitor = 0; /* disable monitoring to avoid infinite recursion */ zlog_warn("%s: write failed to vty client fd %d, closing: %s", __func__, vty->fd, safe_strerror(errno)); buffer_reset(vty->obuf); @@ -1349,6 +1350,7 @@ vty_read (struct thread *thread) vty_event (VTY_READ, vty_sock, vty); return 0; } + vty->monitor = 0; /* disable monitoring to avoid infinite recursion */ zlog_warn("%s: read error on vty client fd %d, closing: %s", __func__, vty->fd, safe_strerror(errno)); } @@ -1571,6 +1573,7 @@ vty_flush (struct thread *thread) switch (flushrc) { case BUFFER_ERROR: + vty->monitor = 0; /* disable monitoring to avoid infinite recursion */ zlog_warn("buffer_flush failed on vty client fd %d, closing", vty->fd); buffer_reset(vty->obuf); @@ -2018,6 +2021,7 @@ vtysh_flush(struct vty *vty) vty_event(VTYSH_WRITE, vty->fd, vty); break; case BUFFER_ERROR: + vty->monitor = 0; /* disable monitoring to avoid infinite recursion */ zlog_warn("%s: write error to fd %d, closing", __func__, vty->fd); buffer_reset(vty->obuf); vty_close(vty); @@ -2053,6 +2057,7 @@ vtysh_read (struct thread *thread) vty_event (VTYSH_READ, sock, vty); return 0; } + vty->monitor = 0; /* disable monitoring to avoid infinite recursion */ zlog_warn("%s: read failed on vtysh client fd %d, closing: %s", __func__, sock, safe_strerror(errno)); } -- cgit v1.2.1