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, |     rc = dixLookupResourceByType((void **) &pCursor, stuff->id, X11_RESTYPE_CURSOR, | ||||||
|                                  client, DixDestroyAccess); |                                  client, DixDestroyAccess); | ||||||
|     if (rc == Success) { |     if (rc == Success) { | ||||||
|  |         if (pCursor == rootCursor) { | ||||||
|  |             client->errorValue = stuff->id; | ||||||
|  |             return BadCursor; | ||||||
|  |         } | ||||||
|         FreeResource(stuff->id, X11_RESTYPE_NONE); |         FreeResource(stuff->id, X11_RESTYPE_NONE); | ||||||
|         return Success; |         return Success; | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue