← Commit list

39b18196f

Denys Vlasenko
Denys Vlasenko
2019-01-06
SUCCESS Duration: 151s

Subject

telnetd: fix bad interaction with vhangup() from login

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

networking/telnetd.c+16 -2
@@ -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;