Summary:
A bug in wsdisplay.c prevents the console screen blanker from being disabled
once it has been enabled.
Details:
The console code includes a screen blanker facility, controlled with wsconsctl:
# wsconsctl display.screen_off
display.screen_off=0
By default, the screen blanker is disabled, (a timeout of zero milliseconds to
switch off the display).
If this is changed to, say, 10000 msec, (10 seconds), the screen blanks after
being inactive for the requested amount of time. However, this cannot then be
disabled again, as a value of zero cannot be set. If this is attempted, the
previous value is retained:
# wsconsctl display.screen_off=10000
display.screen_off=10000
# wsconsctl display.screen_off=0
display.screen_off=10000
Fix:
Although this issue can be worked around by setting the timeout to a very large
value, the following patch fixes the problem correctly by allowing a value of
zero to be set.
untrusted comment: verify with Exotic Silicon public signify key
RWRn5d3Yx35u0xMu23d1FXp8/gk1RD6tbS4V4/itPfs30MERqir90ezxVsxgmI9B3yshg2e/mTDYayITyM9vFpbECHwGSZySEAI=
--- wsdisplay.c.dist Thu May 5 15:50:12 2022
+++ wsdisplay.c Thu May 5 16:10:45 2022
@@ -1233,7 +1233,7 @@
error = 0;
sc->sc_burnflags = d->flags;
/* disable timeout if necessary */
- if ((sc->sc_burnflags & (WSDISPLAY_BURN_OUTPUT |
+ if (d->off==0 || (sc->sc_burnflags & (WSDISPLAY_BURN_OUTPUT |
WSDISPLAY_BURN_KBD | WSDISPLAY_BURN_MOUSE)) == 0) {
if (sc->sc_burnout)
timeout_del(&sc->sc_burner);
@@ -1252,14 +1252,12 @@
wsdisplay_burn(sc, sc->sc_burnflags);
}
}
- if (d->off) {
- sc->sc_burnoutintvl = d->off;
- if (!sc->sc_burnman) {
- sc->sc_burnout = sc->sc_burnoutintvl;
- /* reinit timeout if changed */
- if ((active->scr_flags & SCR_GRAPHICS) == 0)
- wsdisplay_burn(sc, sc->sc_burnflags);
- }
+ sc->sc_burnoutintvl = d->off;
+ if (!sc->sc_burnman) {
+ sc->sc_burnout = sc->sc_burnoutintvl;
+ /* reinit timeout if changed */
+ if ((active->scr_flags & SCR_GRAPHICS) == 0)
+ wsdisplay_burn(sc, sc->sc_burnflags);
}
return (error);
}