diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-08-10 09:50:16 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-08-13 11:19:35 +1000 |
commit | e46f02fa2de79261221b42ab73f9daa2ce8ac650 (patch) | |
tree | 9039ee5071bf61b632c1bd9fd7a046e172c856c9 | |
parent | 8483b08152104dc619d9e44f877d2687d866355e (diff) |
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>
-rw-r--r-- | Xext/xtest.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/Xext/xtest.c b/Xext/xtest.c index 5eddffaf1..624873200 100644 --- a/Xext/xtest.c +++ b/Xext/xtest.c @@ -52,12 +52,17 @@ #include "modinit.h" extern int DeviceValuator; 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 #include "panoramiX.h" #include "panoramiXsrv.h" #endif static int XTestSwapFakeInput( @@ -79,12 +84,14 @@ static DISPATCH_PROC(SProcXTestGrabControl); void XTestExtensionInit(INITARGS) { AddExtension(XTestExtensionName, 0, 0, ProcXTestDispatch, SProcXTestDispatch, NULL, StandardMinorOpcode); + + xtest_evlist = InitEventList(GetMaximumEventsNum()); } static int ProcXTestGetVersion(ClientPtr client) { xXTestGetVersionReply rep; @@ -152,13 +159,12 @@ ProcXTestFakeInput(ClientPtr client) WindowPtr root; Bool extension = FALSE; deviceValuator *dv = NULL; int valuators[MAX_VALUATORS] = {0}; int numValuators = 0; int firstValuator = 0; - EventListPtr events; int nevents = 0; int i; int base = 0; int flags = 0; nev = (stuff->length << 2) - sizeof(xReq); @@ -404,32 +410,31 @@ ProcXTestFakeInput(ClientPtr client) } break; } if (screenIsSaved == SCREEN_SAVER_ON) dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset); - GetEventList(&events); switch(type) { case MotionNotify: - nevents = GetPointerEvents(events, dev, type, 0, flags, + nevents = GetPointerEvents(xtest_evlist, dev, type, 0, flags, firstValuator, numValuators, valuators); break; case ButtonPress: case ButtonRelease: - nevents = GetPointerEvents(events, dev, type, ev->u.u.detail, + nevents = GetPointerEvents(xtest_evlist, dev, type, ev->u.u.detail, flags, firstValuator, numValuators, valuators); break; case KeyPress: case KeyRelease: - nevents = GetKeyboardEvents(events, dev, type, ev->u.u.detail); + nevents = GetKeyboardEvents(xtest_evlist, dev, type, ev->u.u.detail); break; } for (i = 0; i < nevents; i++) - mieqProcessDeviceEvent(dev, (InternalEvent*)(events+i)->event, NULL); + mieqProcessDeviceEvent(dev, (InternalEvent*)(xtest_evlist+i)->event, NULL); miPointerUpdateSprite(dev); return client->noClientException; } static int |