telnetd: fix bad interaction with vhangup() from login
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
935afafcf3
commit
39b18196f8
@ -865,11 +865,25 @@ int telnetd_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
skip3:
|
skip3:
|
||||||
if (/*ts->size2 < BUFSIZE &&*/ FD_ISSET(ts->ptyfd, &rdfdset)) {
|
if (/*ts->size2 < BUFSIZE &&*/ FD_ISSET(ts->ptyfd, &rdfdset)) {
|
||||||
/* Read from pty to buffer 2 */
|
/* Read from pty to buffer 2 */
|
||||||
|
int eio = 0;
|
||||||
|
read_pty:
|
||||||
count = MIN(BUFSIZE - ts->rdidx2, BUFSIZE - ts->size2);
|
count = MIN(BUFSIZE - ts->rdidx2, BUFSIZE - ts->size2);
|
||||||
count = safe_read(ts->ptyfd, TS_BUF2(ts) + ts->rdidx2, count);
|
count = safe_read(ts->ptyfd, TS_BUF2(ts) + ts->rdidx2, count);
|
||||||
if (count <= 0) {
|
if (count <= 0) {
|
||||||
if (count < 0 && errno == EAGAIN)
|
if (count < 0) {
|
||||||
goto skip4;
|
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;
|
goto kill_session;
|
||||||
}
|
}
|
||||||
ts->size2 += count;
|
ts->size2 += count;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user