From: iiitac@swan.pyr (Alan Cox) Subject: Serial Drivers Date: Thu, 28 Jan 1993 16:54:32 GMT The 0.99.2/3/4 serial drivers have a set of bugs to do with CLOCAL, these prevent several programs that should work from working on lines without the carrier signal present. When the terminal is opened the line is marked as hung_up and when CLOCAL is then set the line is not restored. In addition the serial driver doesn't block until carrier is raised in normal use as Unix systems do. I've posted Linus a set of patches a while ago for this and 0.99.2 , but only for the new interrupt handler, these also allow you to select() on a tty open like the sys5.4 terminal managers do. In the meantime a warning for anyone using the amateur radio KA9Q version I released. DONT upgrade to 0.99.2 without the serial patches I included and DONT upgrade to 0.99.3 or .4. I'll try and merge the serial fixes into the 0.99.4 kernel and resubmit them again. Alan
From: tytso@athena.mit.edu (Theodore Ts'o) Subject: Re: Serial Drivers Date: 29 Jan 1993 15:25:56 -0500 Reply-To: tytso@athena.mit.edu (Theodore Ts'o) From: iiitac@swan.pyr (Alan Cox) Date: Thu, 28 Jan 1993 16:54:32 GMT The 0.99.2/3/4 serial drivers have a set of bugs to do with CLOCAL, these prevent several programs that should work from working on lines without the carrier signal present. When the terminal is opened the line is marked as hung_up and when CLOCAL is then set the line is not restored. This is not a bug; if you do this, you create a security hole which obviates half the reason for doing the tty hangup in the first place. Consider: you are running a dialup service; evil bad person (tm) dials up, and leaves a trojan program which looks like /bin/login. But when he/she hangs up, all processes attached to the modem lose their access to the modem. No problem. Now assume that setting CLOCAL allows you to "unhangup" the line. Evil Bad Person changes his/her program to wait until after he hangs up, and then sets CLOCAL; voila'! Instant trojan horse. But you, you say, the Evil Bad Person could have set CLOCAL before he/she logged out, which would do the same thing. No! Because getty will calls vhangup() on the line, which will forcibly hang up all processes on the line, CLOCAL or no. So Evil Bad Person merely has to wait until after getty has called vhangup(), and *then* he sets CLOCAL, which undoes the hangup condition and his trojan horse program can run and screw users. Moral of the story: you don't want to blithly undo a hangup condition, unless you want to open up a security hole on your system. The right way to handle this is as follows: 1) open the serial line with the O_NONBLOCK flag 2) set CLOCAL 3) open the serial line *again* 4) close the serial line opened in step #1 5) proceed with whatever your program needs to do, using the file descriptor obtained in step #3 This is the only really portable way to deal with the whole question of CLOCAL and lines hanging up/not hanging up. - Ted