Subject: kern/11827: wscons vt100 emulation botches scroll region
To: None <gnats-bugs@gnats.netbsd.org>
From: None <sommerfeld@netbsd.org>
List: netbsd-bugs
Date: 12/27/2000 12:25:16
>Number:         11827
>Category:       kern
>Synopsis:       wscons-vt100 scrolls when outside scroll region
>Confidential:   yes
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Dec 27 12:25:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Bill Sommerfeld
>Release:        200012xx
>Organization:
	
>Environment:

System: NetBSD syn 1.5O NetBSD 1.5O (VAIO) #7: Wed Dec 27 15:06:41 EST 2000 wes@syn:/usr/wes/vanilla-sys/arch/i386/compile/VAIO i386


>Description:

This bug was noticed by Richard Tibbetts <tibbetts@mit.edu>

wscons output involving a newline or line wrap below the scroll region
forces the screen to scroll; this does not match (e.g.)  xterm
behavior.

>How-To-Repeat:

uudecode the following, and send to
	a) an xterm.
	b) wscons running in 80x50 mode.

Observe that the final screen state is not the same.
	
begin 664 screen-bug-test
M&UL_-V@;6SX;6S\Q:!L@1AM;/S1L&ULT;!M;,&T/&ULQ.S4P<AM;2!M;2AM;
M2!M;2AM;-#E"&ULW;2`M+2`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@&ULR-VT;6T@;6T@;6TH;6S0Y0AM;-VTQ,SHP,R`\/B`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@(!M;,C=M&UM(&ULT.4(;6TL;6S=M,3,Z,#,@/'9T
M/B`P*B!V="`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`;6T@;6S(W;1M;2!M;2AM;-#E"
M&ULW;3$S.C`S(#QV=#X@,"H@=G0@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@&UM(&ULT
M.4(;6TLQ,SHP,R`\=G0^(#`J('9T("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(!M;2!M;
M-#E"&UM+,3,Z,#,@/&UA:6P^(#`@=G0@(#$J(&UA:6P@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`;6T@;
M6S(W;1M;2!M;2AM;-#E"&ULW;3$S.C`S(#QM86EL/B`P('9T("`Q*B!M86EL
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@&UM(&ULT.4(;6TLQ,SHP,R`\;6%I;#X@,"!V="`@,2H@;6%I
M;"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@(!M;2!M;-#E"&UM+,3,Z,#,@/&5M86-S/B`P('9T("`Q(&UA
M:6P@(#(J(&5M86-S("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`;6T@;6S(W;1M;2!M;2AM;-#E"&ULW;3$S.C`S(#QE;6%C
M<SX@,"!V="`@,2!M86EL("`R*B!E;6%C<R`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@&UM(&ULT.4(;6TLQ,SHP,R`\96UA
M8W,^(#`@=G0@(#$@;6%I;"`@,BH@96UA8W,@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@(!M;2!M;-#E"&UM+,3,Z,#,@/'1C
M<V@^(#`@=G0@(#$@;6%I;"`@,B!E;6%C<R`@,RH@=&-S:"`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`;6T@;6S(W;1M;2!M;2AM;-#E"
M&ULW;3$S.C`S(#QT8W-H/B`P('9T("`Q(&UA:6P@(#(@96UA8W,@(#,J('1C
M<V@@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@&UM(&ULT
M.4(;6TLQ,SHP,R`\=&-S:#X@,"!V="`@,2!M86EL("`R(&5M86-S("`S*B!T
M8W-H("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(!M;2!M;
M-#E"&UM+,3,Z,#,@/'9T/B`P*B!V="`@,2!M86EL("`R(&5M86-S("`S('1C
M<V@@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`;6T@;
M6S(W;1M;2!M;2AM;-#E"&ULW;3$S.C`S(#QV=#X@,"H@=G0@(#$@;6%I;"`@
M,B!E;6%C<R`@,R!T8W-H("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@&UM(&ULR-VT;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*
M&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;
M6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;
M2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+
M"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL;6S0W05-C<F5E;B!V
M97)S:6]N(#,N,#DN,#0@*$9!52D@,3$M075G+3DY#0H*0V]P>7)I9VAT("AC
M*2`Q.3DS+3$Y.3D@2G5E<F=E;B!796EG97)T+"!-:6-H865L(%-C:')O961E
M<@T*0V]P>7)I9VAT("AC*2`Q.3@W($]L:79E<B!,875M86YN#0H*5&AI<R!P
M<F]G<F%M(&ES(&9R964@<V]F='=A<F4[('EO=2!C86X@<F5D:7-T<FEB=71E
M(&ET(&%N9"]O<B!M;V1I9GD@:70@=6YD97(-"G1H92!T97)M<R!O9B!T:&4@
M1TY5($=E;F5R86P@4'5B;&EC($QI8V5N<V4@87,@<'5B;&ES:&5D(&)Y('1H
M92!&<F5E(%-O9G1W87)E#0I&;W5N9&%T:6]N.R!E:71H97(@=F5R<VEO;B`R
M+"!O<B`H870@>6]U<B!O<'1I;VXI(&%N>2!L871E<B!V97)S:6]N+@T*"E1H
M:7,@<')O9W)A;2!I<R!D:7-T<FEB=71E9"!I;B!T:&4@:&]P92!T:&%T(&ET
M('=I;&P@8F4@=7-E9G5L+"!B=70@5TE42$]55`T*04Y9(%=!4E)!3E19.R!W
M:71H;W5T(&5V96X@=&AE(&EM<&QI960@=V%R<F%N='D@;V8@34520TA!3E1!
M0DE,2519(&]R($9)5$Y%4U,-"D9/4B!!(%!!4E1)0U5,05(@4%524$]312X@
M4V5E('1H92!'3E4@1V5N97)A;"!0=6)L:6,@3&EC96YS92!F;W(@;6]R92!D
M971A:6QS+@T*"EEO=2!S:&]U;&0@:&%V92!R96-E:79E9"!A(&-O<'D@;V8@
M=&AE($=.52!'96YE<F%L(%!U8FQI8R!,:6-E;G-E(&%L;VYG('=I=&@-"G1H
M:7,@<')O9W)A;2`H<V5E('1H92!F:6QE($-/4%E)3D<I.R!I9B!N;W0L('=R
M:71E('1O('1H92!&<F5E(%-O9G1W87)E#0I&;W5N9&%T:6]N+"!);F,N+"`U
M.2!496UP;&4@4&QA8V4@+2!3=6ET92`S,S`L($)O<W1O;BP@34$@(#`R,3$Q
M+3$S,#<L(%5302X-"@I396YD(&)U9W)E<&]R=',L(&9I>&5S+"!E;FAA;F-E
M;65N=',L('0M<VAI<G1S+"!M;VYE>2P@8F5E<B`F('!I>GIA('1O#0IS8W)E
M96Y`=6YI+65R;&%N9V5N+F1E&ULT.#LR-4A;4')E<W,@4W!A8V4@;W(@4F5T
M=7)N('1O(&5N9"Y=#0H;6T@;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*
M&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;
M6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;
M2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+
M"AM;2PH;6TL*&UM+"AM;2PH;6TL*&UM+"AM;2PH;6TL;6S9!=7-I;F<@<W5B
M<R!F<F]M("]A9G,O871H96YA+FUI="YE9'4O=7-E<B]T+VDO=&EB8F5T=',O
M+GIE<&AY<BYS=6)S+G9T#0IS=&%R=&EN9R!A=71O7W)E<VEZ90T*=7-I;F<@
M<W5B<R!F<F]M("]A9G,O871H96YA+FUI="YE9'4O=7-E<B]T+VDO=&EB8F5T
M=',O+GIE<&AY<BYS=6)S+G9T#0HM+2T@5V]R;&0@("TM+0T*+2TM+2UD;VYE
M(&QO861I;F<@+FQO8V%L+G9T8RTM+2TM#0HM7S(^86QE='1A7S$^=&EB8F5T
M='-?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?
M7U]?7U]?7U]?7U]?7U]?7QM;-#@[.#!(#1M;01M;,3LT-W(;6S0W.S%("BTM
M+2TM9&]N92!L;V%D:6YG("YS971T:6YG<RYV=&,M+2TM+1M;-#@[,4@;6S,V
M;1M;-#!M+5\K,2M?,CYA;&5T=&%?,3YT:6)B971T<U]?7U]?7U]?7U]?7U]?
M7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7PT*&ULR
M00HM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM#0IZ=V=C(&EN
M('1T>6UO9&4@;VYL>2P@>G)E<&QA>2!W:6QL(&YO="!W;W)K&ULT.#LQ2"U?
M,CYA;&5T=&%?,3YT:6)B971T<U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?
M7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U\;6S$[-3!(&ULT.3LQ
M2`H;6TL;6S=M&ULS.6T;6S0Y;3$S.C`T(#QV=#X@,"H@=G0@(#$@;6%I;"`@
M,B!E;6%C<R`@,R!T8W-H("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@#1M;01M;,C=M&ULS-FT;6S0P;1M;,D$*6E='0R`@("`@("U7
M1U]#5$P@("`@+2U:=V=C(&UA<FL@24D@=F5R<VEO+BXN("![5T=?4U1!4E15
M4'T@6U='7T-43%]54T52/#P\/CX^71M;,S)M#0IA;&5X7V,@("`@(',N;V9F
M:6-E+F0@($=O;&5M+"!))VT@:G5S="!I;B!T:&4@8VQU<W1E<BX@0V%L;"!I
M9B!Y;W4@;F5E9"!A(&AU9RX-"B`@("`Z*2`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`M+4%L97@@
M0V]V96YT<GD;6S,V;0T*&ULT.3LQ2!M;,D$*9"YG0&%C;2YO<F<@("`@("`@
M("`@("`@("`@("`@("`Q,B\R-R`Q,CHU."`@=&%M8G5R82YC<RYB97)K96QE
M>2YE9'4-"F%W9FEE9D!C<RYB<F%N9&5I<RYE9'4@("`@("`@("`@,3(O,C<@
M,3(Z-#<@(&1S;#(U-"TP.3DM,#0S+6YY8S$N9'-L+6ES<"YN970;6S0Y.S%(
M&UM!+5\Q/G1I8F)E='1S7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?
M7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7PTM7QM;,S5M
M*C(^86QE='1A&ULS-FU?,3YT:6)B971T<U]?7U]?7U]?7U]?7U]?7U]?7U]?
L7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7PT*&ULR00I?
`
end

>Fix:

This appears to fix the problem but has not been extensively tested;
also, the code sequence in question should probably be refactored as
it occurrs 3 times in the driver.

The current logic is: 
	scroll if we are at or below the bottom of the
	scroll region, otherwise move down a line

The enclosed patch changes this to:

	scroll if we are at the bottom of the scroll region,
	otherwise, move down a line if we are not at the bottom of the
	screen.

It is not clear if the "move down a line if outside the scroll region"
behavior of the patch is correct; however, the existing behavior is
clearly incorrect.

Index: wsemul_vt100.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/wscons/wsemul_vt100.c,v
retrieving revision 1.13
diff -u -r1.13 wsemul_vt100.c
--- wsemul_vt100.c	2000/04/28 21:56:16	1.13
+++ wsemul_vt100.c	2000/12/27 20:15:17
@@ -324,11 +324,13 @@
 
 	if ((edp->flags & (VTFL_LASTCHAR | VTFL_DECAWM)) ==
 	    (VTFL_LASTCHAR | VTFL_DECAWM)) {
-		if (ROWS_BELOW > 0) {
-			edp->crow++;
+		if (ROWS_BELOW == 0) {
+		  	wsemul_vt100_scrollup(edp, 1);
+		} else {
+			if ((edp->crow+1) < edp->nrows)
+				edp->crow++;
 			CHECK_DW;
-		} else
-			wsemul_vt100_scrollup(edp, 1);
+		}
 		edp->ccol = 0;
 		edp->flags &= ~VTFL_LASTCHAR;
 	}
@@ -437,11 +439,13 @@
 	    case ASCII_LF:
 	    case ASCII_VT:
 	    case ASCII_FF:
-		if (ROWS_BELOW > 0) {
-			edp->crow++;
+		if (ROWS_BELOW == 0) {
+		  	wsemul_vt100_scrollup(edp, 1);
+		} else {
+			if ((edp->crow+1) < edp->nrows)
+				edp->crow++;
 			CHECK_DW;
-		} else
-			wsemul_vt100_scrollup(edp, 1);
+		}
 		break;
 	}
 }
@@ -497,12 +501,13 @@
 		edp->ccol = 0;
 		/* FALLTHRU */
 	    case 'D': /* IND */
-		if (ROWS_BELOW > 0) {
-			edp->crow++;
+		if (ROWS_BELOW == 0) {
+		  	wsemul_vt100_scrollup(edp, 1);
+		} else {
+			if ((edp->crow+1) < edp->nrows)
+				edp->crow++;
 			CHECK_DW;
-			break;
 		}
-		wsemul_vt100_scrollup(edp, 1);
 		break;
 	    case 'H': /* HTS */
 		KASSERT(edp->tabs != 0);

>Release-Note:
>Audit-Trail:
>Unformatted: