summaryrefslogtreecommitdiff
path: root/mi/mipointer.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2008-05-16 20:56:04 +0930
committerPeter Hutterer <peter@cs.unisa.edu.au>2008-05-16 20:56:04 +0930
commitdfb7de6571345061d1cd88ab915064fc376529fd (patch)
tree2f62b8cca24befb5f43f32c439fb39e8c29184eb /mi/mipointer.c
parentf611719edce2ae51dca8e53947a3938b53c20b00 (diff)
mi: don't call from miPointerMoved into the spriteFuncs for anything but VCP.
Calling ->MoveCursor for anything but the HW-rendered VCP causes the SW-rendered cursor routines to be started, including mallocs, etc. Since miPointerMoved is called during SIGIO, this is a bad idea.
Diffstat (limited to 'mi/mipointer.c')
-rw-r--r--mi/mipointer.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/mi/mipointer.c b/mi/mipointer.c
index 484947da9..6f39bcb5c 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -530,7 +530,11 @@ miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
pPointer = MIPOINTER(pDev);
- if (pDev && pDev->coreEvents
+ /* Hack: We mustn't call into ->MoveCursor for anything but the
+ * VCP, as this may cause a non-HW rendered cursor to be rendered during
+ * SIGIO. This again leads to allocs during SIGIO which leads to SIGABRT.
+ */
+ if ((pDev == inputInfo.pointer || (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
&& !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen)
{
pPointer->devx = x;