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 -0000       1.53
> +++ tip.c     3 Dec 2012 22:28:39 -0000
> @@ -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));

Reply via email to