home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.unix.bsd
- Path: sparky!uunet!sun-barr!cs.utexas.edu!sdd.hp.com!usc!sol.ctr.columbia.edu!ucselx!crash!fpm
- From: fpm@crash.cts.com (Frank Maclachlan)
- Subject: 386BSD 0.1 pccons bug crashes system (w/ fix)
- Organization: CTS Network Services (crash, ctsnet), El Cajon, CA
- Date: 24 Aug 92 17:44:42 PDT
- Message-ID: <1992Aug24.174443.22587@crash>
- Followup-To: comp.unix.bsd
- Keywords: 386BSD pccons
- Lines: 55
-
- Greetings:
-
- I was horrified whilst scrolling backwards in a file with the less
- pager at my console when my 386BSD system suddenly rebooted.
- Subsequent tests revealed that the system would crash whenever I
- scrolled rapidly backwards through this file using less.
-
- Most files won't cause the system to crash. To demonstrate the failure,
- do the the following (if you don't mind watching your system crash):
-
- hd /usr/mdec/bootwd >junk # create a file
- less junk # invoke less
- G # go to the end of the file
- ^B^B^B... # rapid repeated control B's to
- # scroll backwards
-
- If you are running the standard console driver ('/sys/i386/isa/pccons.c'),
- the system will probably crash.
-
- The problem is caused by sput() in pccons being reentered while
- processing escape sequences. Sput(), however, is not reentrant; in
- this particular case, the parameter to the scroll down code was being
- modified resulting in the kernel being scrolled down (or somewhere). :-(
-
- My probably non-optimal fix to '/sys/i386/isa/pccons.c' is given below:
-
-
- *** pccons.c.ORIG Mon Aug 24 18:09:23 1992
- --- pccons.c Mon Aug 24 18:12:28 1992
- ***************
- *** 344,353 ****
- if (RB_LEN(&tp->t_out) == 0)
- goto out;
- c = getc(&tp->t_out);
- ! /*tp->t_state |= TS_BUSY;*/
- splx(s);
- sput(c, 0);
- (void)spltty();
- } while(1);
- out:
- splx(s);
- --- 344,354 ----
- if (RB_LEN(&tp->t_out) == 0)
- goto out;
- c = getc(&tp->t_out);
- ! tp->t_state |= TS_BUSY;
- splx(s);
- sput(c, 0);
- (void)spltty();
- + tp->t_state &= ~TS_BUSY;
- } while(1);
- out:
- splx(s);
-
- -- Frank MacLachlan
-