Re: Hard system hangs on tty code (6-current)

From: Doug White <dwhite_at_gumbysoft.com>
Date: Mon, 3 Jan 2005 10:12:46 -0800 (PST)
Could you file a PR on this? Thanks!

On Sun, 2 Jan 2005, Slawa Olhovchenkov wrote:

> 6-current totally hangs by this program, from user, not root.
> No responds on keys pressed, Control-Alt-ESC, switching console and etc.
>
> System run in infinite loop in sys/kern/tty.c:ttread()
>
> ===
> read:
>         splx(s);
>         /*
>          * Input present, check for input mapping and processing.
>          */
>         first = 1;
>         if (ISSET(lflag, ICANON | ISIG))
>                 goto slowcase;
>         for (;;) {
>                 char ibuf[IBUFSIZ];
>                 int icc;
>
>                 icc = imin(uio->uio_resid, IBUFSIZ);
> /* XXX uio_resid==0 => icc=0 */
>                 icc = q_to_b(qp, ibuf, icc);
> /* icc == 0 */
>                 if (icc <= 0) {
>                         if (first)
>                                 goto loop;
>
> ===
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <errno.h>
> #include <termios.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <string.h>
>
> #define cfmakeraw(ptr) (ptr)->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR\
> 					 |IGNCR|ICRNL|IXON);\
>                        (ptr)->c_oflag &= ~OPOST;\
>                        (ptr)->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);\
>                        (ptr)->c_cflag &= ~(CSIZE|PARENB);\
>                        (ptr)->c_cflag |= CS8
>
>
> int
> main(int argc, char *argv[])
> {
> 	int 	fd,
> 		i;
> 	char *buf[1024];
>
> 	struct termios tcn;
> 	if ((fd = open("/dev/tty", O_RDWR | O_NONBLOCK)) == -1) {
> 		return -1;	/* errno already set */
> 	}
>
> 	/* Set the tty to raw and to the correct speed */
> 	tcgetattr(fd, &tcn);
>
> 	tcn.c_oflag 	= 0;
> 	tcn.c_iflag 	= IGNBRK | IGNPAR;
> 	tcn.c_cflag 	= CREAD | CLOCAL | CS8;
>
> 	tcn.c_lflag = NOFLSH;
>
> 	cfmakeraw(&tcn);
>
> 	for (i = 0; i < 16; i++)
> 		tcn.c_cc[i] = 0;
>
> 	tcn.c_cc[VMIN] 	= 1;
> 	tcn.c_cc[VTIME] = 0;
>
> 	tcsetattr(fd, TCSANOW, &tcn);
>
> 	if ((i = fcntl(fd, F_GETFL, 0)) != -1) {
> 		i &= ~O_NONBLOCK;
> 		fcntl(fd, F_SETFL, i);
> 	}
> 	read(fd, buf, 0);
>
> }
>
>
>
>

-- 
Doug White                    |  FreeBSD: The Power to Serve
dwhite_at_gumbysoft.com          |  www.FreeBSD.org
Received on Mon Jan 03 2005 - 17:12:46 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:25 UTC