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:
		
							parent
							
								
									8483b08152
								
							
						
					
					
						commit
						e46f02fa2d
					
				
							
								
								
									
										17
									
								
								Xext/xtest.c
								
								
								
								
							
							
						
						
									
										17
									
								
								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; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue