Makes sense to me, ok nicm
On Mon, Dec 03, 2012 at 11:38:49PM +0100, Mark Kettenis wrote:
So the code doesn't check for EOF, and even has a nice fat XXX for it.
This has some nasty consequences. If you ssh into a machine, run
cu(1), and then break the connection, cu(1) start sending the '-1'
character down the serial line like crazy. This is especially bad
since it seems our tty subsystem hangs on closing a tty if it has any
characters in its output buffer. This diff adds the necessary EOF
checks and calls cleanup(0) if it detects one, which will terminate
the process.
ok?
Index: tip.c
===
RCS file: /cvs/src/usr.bin/tip/tip.c,v
retrieving revision 1.53
diff -u -p -r1.53 tip.c
--- tip.c 3 Jul 2010 03:33:12 - 1.53
+++ tip.c 3 Dec 2012 22:28:39 -
@@ -296,8 +296,10 @@ tipin(void)
}
while (1) {
- gch = getchar()STRIP_PAR;
- /* XXX does not check for EOF */
+ gch = getchar();
+ if (gch == EOF)
+ cleanup(0);
+ gch = STRIP_PAR;
if (gch == vgetnum(ESCAPE) bol) {
if (!noesc) {
if (!(gch = escape()))
@@ -313,8 +315,12 @@ tipin(void)
if (vgetnum(HALFDUPLEX))
printf(\r\n);
continue;
- } else if (!cumode gch == vgetnum(FORCE))
- gch = getchar() STRIP_PAR;
+ } else if (!cumode gch == vgetnum(FORCE)) {
+ gch = getchar();
+ if (gch == EOF)
+ cleanup(0);
+ gch = STRIP_PAR;
+ }
bol = any(gch, vgetstr(EOL));
if (vgetnum(RAISE) islower(gch))
gch = toupper(gch);
@@ -338,8 +344,10 @@ escape(void)
esctable_t *p;
char c = vgetnum(ESCAPE);
- gch = (getchar()STRIP_PAR);
- /* XXX does not check for EOF */
+ gch = getchar();
+ if (gch == EOF)
+ cleanup(0);
+ gch = STRIP_PAR;
for (p = etable; p-e_char; p++)
if (p-e_char == gch) {
printf(%s, ctrl(c));