Subject: Re: telnet spins to dead tty
To: None <tech-userlevel@netbsd.org>
From: Christos Zoulas <christos@zoulas.com>
List: tech-userlevel
Date: 10/25/2002 17:19:15
In article <20021025075812.B22781@shrubbery.net>,
john heasley <heas@shrubbery.net> wrote:
>i have a set of scripts that use expect to login to devices via telnet
>(or ssh). if the scripts are not configured properly, it is possible
>that the expect script deadlocks waiting for the output it expects
>once a login (username and password) is successful.
>
>a timeout ensues and the expect script closed the tty and waits for
>the process for the child to exit. and sometime after this, the device
>closes the connection due to inactivity.
>
>here's the telnet issue; telnet takes a SIGPIPE and spins out of control
>trying to flush the tty facing expect, terminal.c:ttyflush().
>
>#0 ttyflush (drop=0) at /home/src/usr.bin/telnet/terminal.c:159
>#1 0x804ed93 in TerminalNewMode (f=-1)
> at /home/src/usr.bin/telnet/sys_bsd.c:445
>#2 0x8053cc8 in setcommandmode () at /home/src/usr.bin/telnet/terminal.c:249
>#3 0x804f143 in deadpeer (sig=13) at /home/src/usr.bin/telnet/sys_bsd.c:869
>#4 0x480fc1f0 in __sigtramp_sigcontext_1 () from /usr/lib/libc.so.12
>#5 0x804e40a in netflush () at /home/src/usr.bin/telnet/network.c:145
>
>so, the telnet process:
>
>COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
>telnet 28617 heas 0u VBAD (revoked)
>telnet 28617 heas 1u VBAD (revoked)
>telnet 28617 heas 2u VBAD (revoked)
>telnet 28617 heas 3u IPv4 0t0 TCP no PCB,
>CANTSENDMORE, CANTRCVMORE
>telnet 28617 heas 4w VREG 0,0 331 1022641 / (/dev/wd0a)
>
>the write(fd=1) within TerminalWrite() returns -1 (errno = 5). but,
>ttyflush() only communicates the following in it's return value:
>
> * Return value:
> * -1: No useful work done, data waiting to go out.
> * 0: No data was waiting, so nothing was done.
> * 1: All waiting data was written out.
> * n: All data - n was written out.
>
>since ttyflush() isnt designed to return a "permanent failure" result,
>the callee just calls it again, forever.
>
>i suppose the question is how best to fix this. teach ttyflush() about
>permanent errors and the folks that call its new return value?
Yes, that would be great. Can you send-pr it?
Thanks,
christos