Hard system hangs on tty code (6-current)
Slawa Olhovchenkov
slw at zxy.spb.ru
Sun Jan 2 05:06:32 PST 2005
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);
}
--
Slawa Olhovchenkov
More information about the freebsd-current
mailing list