Re: tip(1)/cu(1) fix

2012-12-04 Thread Nicholas Marriott
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));



tip(1)/cu(1) fix

2012-12-03 Thread Mark Kettenis
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));