[lib] Fix infinite recursion for errors on vtys with terminal monitor enabled

2006-07-10 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

	* 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.).
diff --git a/lib/vty.c b/lib/vty.c
index 8de3287..98e7506 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -182,6 +182,7 @@
 	   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_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 @@
   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 @@
       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 @@
 	      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));
 	}