summaryrefslogtreecommitdiff
authorXiang, Haihao <haihao.xiang@intel.com>2009-01-06 02:03:19 (GMT)
committer Keith Packard <keithp@keithp.com>2009-01-09 17:37:56 (GMT)
commit5f3188228eb988bd8f08b62c84f98a8ff66ee283 (patch) (side-by-side diff)
tree6ded4b8021b4986c30b3e8b09b56a4744f3c899b
parentb2756a71a432f7cf7c870a48676c98625512558d (diff)
downloadxserver-5f3188228eb988bd8f08b62c84f98a8ff66ee283.zip
xserver-5f3188228eb988bd8f08b62c84f98a8ff66ee283.tar.gz
avoid a potential endless loop.
Previously it is possible that creating rotation data, then cleaning up and creating again so that pScreen->BlockHandler and xf86_config->BlockHandler all point to xf86RotateBlockHandler. See bug #19343.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--hw/xfree86/modes/xf86Rotate.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c
index 8e03c6c..21b7aff 100644
--- a/hw/xfree86/modes/xf86Rotate.c
+++ b/hw/xfree86/modes/xf86Rotate.c
@@ -291,6 +291,8 @@ xf86RotateBlockHandler(int screenNum, pointer blockData,
/* Re-wrap if rotation is still happening */
xf86_config->BlockHandler = pScreen->BlockHandler;
pScreen->BlockHandler = xf86RotateBlockHandler;
+ } else {
+ xf86_config->BlockHandler = NULL;
}
}
@@ -477,8 +479,10 @@ xf86CrtcRotate (xf86CrtcPtr crtc)
goto bail2;
/* Wrap block handler */
- xf86_config->BlockHandler = pScreen->BlockHandler;
- pScreen->BlockHandler = xf86RotateBlockHandler;
+ if (!xf86_config->BlockHandler) {
+ xf86_config->BlockHandler = pScreen->BlockHandler;
+ pScreen->BlockHandler = xf86RotateBlockHandler;
+ }
}
#ifdef RANDR_12_INTERFACE
if (transform)