telnet/telnet-0.17-pty-retry.patch
Troy Dawson a36e3113ae RHEL 9.0.0 Alpha bootstrap
The content of this branch was automatically imported from Fedora ELN
with the following as its source:
https://src.fedoraproject.org/rpms/telnet#7fe48cbcb5d5c5594e848a95b4884cf0c09360eb
2020-10-15 10:26:56 -07:00

43 lines
1.2 KiB
Diff

--- a/telnetd/telnetd.c
+++ b/telnetd/telnetd.c
@@ -772,7 +772,6 @@ void telnet(int f, int p)
int on = 1;
char *HE;
const char *IM;
- int pty_read_ok = 0; /* track whether the pty read has worked yet */
/*
* Initialize the slc mapping table.
@@ -1086,19 +1085,24 @@ void telnet(int f, int p)
* Something to read from the pty...
*/
if (FD_ISSET(p, &ibits)) {
+ int eio = 0;
+read_pty:
pcc = read(p, ptyibuf, BUFSIZ);
- /*
- * On some systems, if we try to read something
- * off the master side before the slave side is
- * opened, we get EIO.
- */
- if (pcc < 0 && (errno == EWOULDBLOCK || (errno == EIO && pty_read_ok == 0))) {
+ if (pcc < 0 && errno == EWOULDBLOCK) {
pcc = 0;
}
+ /*
+ * If we try to read something off the master side while the slave
+ * side is temporarily closed by login process, we get EIO.
+ */
+ else if (pcc < 0 && errno == EIO && eio < 1000) {
+ eio++;
+ poll(NULL, 0, 10);
+ goto read_pty;
+ }
else {
if (pcc <= 0)
break;
- pty_read_ok = 1; /* mark connection up for read */
#ifdef LINEMODE
/*
* If ioctl from pty, pass it through net