From 39b18196f89a6f595d47c2a9c3a62c50d413c054 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 6 Jan 2019 19:06:01 +0100 Subject: [PATCH] telnetd: fix bad interaction with vhangup() from login Signed-off-by: Denys Vlasenko --- networking/telnetd.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/networking/telnetd.c b/networking/telnetd.c index a6bafa21d..caef15181 100644 --- a/networking/telnetd.c +++ b/networking/telnetd.c @@ -865,11 +865,25 @@ int telnetd_main(int argc UNUSED_PARAM, char **argv) skip3: if (/*ts->size2 < BUFSIZE &&*/ FD_ISSET(ts->ptyfd, &rdfdset)) { /* Read from pty to buffer 2 */ + int eio = 0; + read_pty: count = MIN(BUFSIZE - ts->rdidx2, BUFSIZE - ts->size2); count = safe_read(ts->ptyfd, TS_BUF2(ts) + ts->rdidx2, count); if (count <= 0) { - if (count < 0 && errno == EAGAIN) - goto skip4; + if (count < 0) { + if (errno == EAGAIN) + goto skip4; + /* login process might call vhangup(), + * which causes intermittent EIOs on read above + * (observed on kernel 4.12.0). Try up to 10 ms. + */ + if (errno == EIO && eio < 10) { + eio++; + //bb_error_msg("EIO pty %u", eio); + usleep(1000); + goto read_pty; + } + } goto kill_session; } ts->size2 += count; -- 2.25.1