st/xorg: Work around cursor reference counting bugs in older X servers.
Could result in use of freed memory and consequently random crashes, e.g. on screen resize. (cherry picked from commit 21c91b410a2a2cbf8eb677e59e3322f86320f2b0) Conflicts: src/gallium/state_trackers/xorg/xorg_tracker.h
This commit is contained in:
@@ -275,7 +275,21 @@ err_bo_destroy:
|
||||
static void
|
||||
crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 * image)
|
||||
{
|
||||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
|
||||
modesettingPtr ms = modesettingPTR(crtc->scrn);
|
||||
|
||||
/* Older X servers have cursor reference counting bugs leading to use of
|
||||
* freed memory and consequently random crashes. Should be fixed as of
|
||||
* xserver 1.8, but this workaround shouldn't hurt anyway.
|
||||
*/
|
||||
if (config->cursor)
|
||||
config->cursor->refcnt++;
|
||||
|
||||
if (ms->cursor)
|
||||
FreeCursor(ms->cursor, None);
|
||||
|
||||
ms->cursor = config->cursor;
|
||||
|
||||
if (ms->screen)
|
||||
crtc_load_cursor_argb_ga3d(crtc, image);
|
||||
#ifdef HAVE_LIBKMS
|
||||
|
||||
@@ -922,6 +922,11 @@ drv_close_screen(int scrnIndex, ScreenPtr pScreen)
|
||||
drv_leave_vt(scrnIndex, 0);
|
||||
}
|
||||
|
||||
if (ms->cursor) {
|
||||
FreeCursor(ms->cursor, None);
|
||||
ms->cursor = NULL;
|
||||
}
|
||||
|
||||
if (cust && cust->winsys_screen_close)
|
||||
cust->winsys_screen_close(cust);
|
||||
|
||||
|
||||
@@ -90,6 +90,7 @@ typedef struct _modesettingRec
|
||||
|
||||
Bool noAccel;
|
||||
Bool SWCursor;
|
||||
CursorPtr cursor;
|
||||
CloseScreenProcPtr CloseScreen;
|
||||
|
||||
/* Broken-out options. */
|
||||
|
||||
Reference in New Issue
Block a user