From 0669eb3b39113d3046eefccd0f2b45de2dba1600 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 10 Aug 2009 09:50:16 +1000 Subject: [PATCH] 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 Signed-off-by: Peter Hutterer --- Xext/xtest.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Xext/xtest.c b/Xext/xtest.c index 5eddffa..6248732 100644 --- a/Xext/xtest.c +++ b/Xext/xtest.c @@ -55,6 +55,11 @@ 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" @@ -82,6 +87,8 @@ XTestExtensionInit(INITARGS) AddExtension(XTestExtensionName, 0, 0, ProcXTestDispatch, SProcXTestDispatch, NULL, StandardMinorOpcode); + + xtest_evlist = InitEventList(GetMaximumEventsNum()); } static int @@ -155,7 +162,6 @@ ProcXTestFakeInput(ClientPtr client) int valuators[MAX_VALUATORS] = {0}; int numValuators = 0; int firstValuator = 0; - EventListPtr events; int nevents = 0; int i; int base = 0; @@ -407,26 +413,25 @@ ProcXTestFakeInput(ClientPtr client) 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; -- 1.6.3.rc1.2.g0164.dirty