Cursor: Refuse to free the root cursor
If a cursor reference count drops to 0, the cursor is freed. The root cursor however is referenced with a specific global variable, and when the root cursor is freed, the global variable may still point to freed memory. Make sure to prevent the rootCursor from being explicitly freed by a client. CVE-2025-26594, ZDI-CAN-25544 This vulnerability was discovered by: Jan-Niklas Sohn working with Trend Micro Zero Day Initiative v2: Explicitly forbid XFreeCursor() on the root cursor (Peter Hutterer <peter.hutterer@who-t.net>) v3: Return BadCursor instead of BadValue (Michel Dänzer <michel@daenzer.net>) Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> Suggested-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1828>
This commit is contained in:
		
							parent
							
								
									530e80375e
								
							
						
					
					
						commit
						01642f263f
					
				|  | @ -3123,6 +3123,10 @@ ProcFreeCursor(ClientPtr client) | |||
|     rc = dixLookupResourceByType((void **) &pCursor, stuff->id, X11_RESTYPE_CURSOR, | ||||
|                                  client, DixDestroyAccess); | ||||
|     if (rc == Success) { | ||||
|         if (pCursor == rootCursor) { | ||||
|             client->errorValue = stuff->id; | ||||
|             return BadCursor; | ||||
|         } | ||||
|         FreeResource(stuff->id, X11_RESTYPE_NONE); | ||||
|         return Success; | ||||
|     } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue