thomas at winischhofer.net
Thu Sep 29 02:56:41 PDT 2005
-----BEGIN PGP SIGNED MESSAGE-----
During my current work to implement RandR rotation support, I discovered
several bugs in RandR, in xf86RandR.c:
1) xf86RandRSetMode: This one calls EnableDisableFBAccess(FALSE) on
entry. Later it calls xf86SwitchMode(). If xf86SwitchMode() fails, it
immediately returns, without EnableDisableFBAccess(TRUE). Bad things
2) xf86RandRSetConfig: This one calls the driver function for rotation
before xf86RandRSetMode(). However, it "forgets" to call it again to
undo the rotation setting, in case xf86RandRSetMode() fails. So while
the client is informed about the failure to set the RandR config, the
driver still thinks it succeeded. Not especially smart either.
3) This is a more conceptual issue:
The sis driver allows switching output devices during server-runtime.
However, not all modes are supported for all available output devices.
Under normal circumstances, the driver's mode validation takes care of this.
RandR does not allow setting a configuration, be it display size, be it
rotation/reflection, without (re-)setting the display mode. This is
For example, if I have a 1280x800 virtual screen and a current display
mode of 1024x768 (eg because I switched from LCD to TV, and TV does not
support 1280x800), setting the RandR config just in order to change the
rotation will cause RandR to try to switch the display mode to 1280x800
(because that is the desired screen size). This will fail (due to the
driver validating the display mode).
At this point everything goes havoc due to the bugs mentioned in 1) and
However, even if the failures of xf86SwitchMode() are handled properly,
the whole RandR request will fail.
So, I propose the following to solve this: RandR should only touch the
display mode if it is too large for the desired screen size. Otherwise
the display mode should be left untouched.
thomas AT winischhofer DOT net *** http://www.winischhofer.net
twini AT xfree86 DOT org
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)
-----END PGP SIGNATURE-----
More information about the xorg