From a5dc17572e59a3a0461ef129c7633fbcab996dfb Mon Sep 17 00:00:00 2001 From: btakahashi Date: Tue, 10 May 2005 00:00:17 +0000 Subject: [PATCH] Limited number of iterations in rote_vt_update to avoid infinite loop with ever-available input to process --- rote.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/rote.c b/rote.c index 19ec25d..322e8eb 100644 --- a/rote.c +++ b/rote.c @@ -26,6 +26,8 @@ Copyright (c) 2004 Bruno T. C. de Oliveira #include #include +#define ROTE_VT_UPDATE_ITERATIONS 5 + RoteTerm *rote_vt_create(int rows, int cols) { RoteTerm *rt; int i, j; @@ -158,9 +160,17 @@ void rote_vt_update(RoteTerm *rt) { struct timeval tvzero; char buf[512]; int bytesread; + int n = ROTE_VT_UPDATE_ITERATIONS; if (rt->pd->pty < 0) return; /* nothing to pump */ - while (1) { + while (n--) { /* iterate at most ROVE_VT_UPDATE_ITERATIONS times. + * As Phil Endecott pointed out, if we don't restrict this, + * a program that floods the terminal with output + * could cause this loop to iterate forever, never + * being able to catch up. So we'll rely on the client + * calling rote_vt_update often, as the documentation + * recommends :-) */ + /* check if pty has something to say */ FD_ZERO(&ifs); FD_SET(rt->pd->pty, &ifs); tvzero.tv_sec = 0; tvzero.tv_usec = 0; -- 2.20.1