Xext: allocate a separate event list for XTest events (#23100)

XTest event processing may be interrupted by a SIGIO. If Xtest uses the same
event list as the rest of the server, this list may be overwritten
in-flight.

X.Org Bug 23100 <http://bugs.freedesktop.org/show_bug.cgi?id=23100>

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2009-08-10 09:50:16 +10:00
parent 8483b08152
commit e46f02fa2d

View File

@ -55,6 +55,11 @@
extern int DeviceValuator; extern int DeviceValuator;
extern int DeviceMotionNotify; extern int DeviceMotionNotify;
/* XTest events are sent during request processing and may be interruped by
* a SIGIO. We need a separate event list to avoid events overwriting each
* other's memory */
static EventListPtr xtest_evlist;
#ifdef PANORAMIX #ifdef PANORAMIX
#include "panoramiX.h" #include "panoramiX.h"
#include "panoramiXsrv.h" #include "panoramiXsrv.h"
@ -82,6 +87,8 @@ XTestExtensionInit(INITARGS)
AddExtension(XTestExtensionName, 0, 0, AddExtension(XTestExtensionName, 0, 0,
ProcXTestDispatch, SProcXTestDispatch, ProcXTestDispatch, SProcXTestDispatch,
NULL, StandardMinorOpcode); NULL, StandardMinorOpcode);
xtest_evlist = InitEventList(GetMaximumEventsNum());
} }
static int static int
@ -155,7 +162,6 @@ ProcXTestFakeInput(ClientPtr client)
int valuators[MAX_VALUATORS] = {0}; int valuators[MAX_VALUATORS] = {0};
int numValuators = 0; int numValuators = 0;
int firstValuator = 0; int firstValuator = 0;
EventListPtr events;
int nevents = 0; int nevents = 0;
int i; int i;
int base = 0; int base = 0;
@ -407,26 +413,25 @@ ProcXTestFakeInput(ClientPtr client)
if (screenIsSaved == SCREEN_SAVER_ON) if (screenIsSaved == SCREEN_SAVER_ON)
dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset); dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
GetEventList(&events);
switch(type) { switch(type) {
case MotionNotify: case MotionNotify:
nevents = GetPointerEvents(events, dev, type, 0, flags, nevents = GetPointerEvents(xtest_evlist, dev, type, 0, flags,
firstValuator, numValuators, valuators); firstValuator, numValuators, valuators);
break; break;
case ButtonPress: case ButtonPress:
case ButtonRelease: case ButtonRelease:
nevents = GetPointerEvents(events, dev, type, ev->u.u.detail, nevents = GetPointerEvents(xtest_evlist, dev, type, ev->u.u.detail,
flags, firstValuator, flags, firstValuator,
numValuators, valuators); numValuators, valuators);
break; break;
case KeyPress: case KeyPress:
case KeyRelease: case KeyRelease:
nevents = GetKeyboardEvents(events, dev, type, ev->u.u.detail); nevents = GetKeyboardEvents(xtest_evlist, dev, type, ev->u.u.detail);
break; break;
} }
for (i = 0; i < nevents; i++) for (i = 0; i < nevents; i++)
mieqProcessDeviceEvent(dev, (InternalEvent*)(events+i)->event, NULL); mieqProcessDeviceEvent(dev, (InternalEvent*)(xtest_evlist+i)->event, NULL);
miPointerUpdateSprite(dev); miPointerUpdateSprite(dev);
return client->noClientException; return client->noClientException;