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 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; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue