diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2019-01-06 19:06:01 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-01-06 19:06:01 +0100 |
commit | 39b18196f89a6f595d47c2a9c3a62c50d413c054 (patch) | |
tree | ef4db62c99834be553c79d7f00daff22f0620456 /networking | |
parent | 935afafcf37e38290e4cc126e328a02877d74fc0 (diff) | |
download | busybox-39b18196f89a6f595d47c2a9c3a62c50d413c054.tar.gz |
telnetd: fix bad interaction with vhangup() from login
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking')
-rw-r--r-- | networking/telnetd.c | 18 |
1 files 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; |