term: always read *all* we can from the client before updating state

But place an upper limit on the number of iterations we read, to
prevent starvation caused by a bad behaving client to constantly
writes data.
This commit is contained in:
Daniel Eklöf 2020-02-05 19:50:49 +01:00
parent d7d2aae053
commit 9d52c422e1
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

View file

@ -147,19 +147,26 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data)
return true;
#endif
uint8_t buf[24 * 1024];
ssize_t count = pollin ? read(term->ptmx, buf, sizeof(buf)) : 0;
if (count < 0) {
LOG_ERRNO("failed to read from pseudo terminal");
return false;
}
vt_from_slave(term, buf, count);
/* Prevent blinking while typing */
term_cursor_blink_restart(term);
uint8_t buf[24 * 1024];
ssize_t count = sizeof(buf);
const size_t max_iterations = 1024;
for (size_t i = 0; i < max_iterations && pollin && count == sizeof(buf); i++) {
assert(pollin);
count = read(term->ptmx, buf, sizeof(buf));
if (count < 0) {
LOG_ERRNO("failed to read from pseudo terminal");
return false;
}
vt_from_slave(term, buf, count);
}
/*
* We likely need to re-render. But, we don't want to
* do it immediately. Often, a single client operation