7084842c1c
- Fix (hopefully) various crashes in FlushAllOutput() (rhbz#1382444) - Fix Xwayland crashing in glamor on non glamor capable hw (rhbz#1390018)
83 lines
3.0 KiB
Diff
83 lines
3.0 KiB
Diff
From 57e7f3bbba2d6a38d31ed0c32b9cf47affc12ddd Mon Sep 17 00:00:00 2001
|
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
|
Date: Thu, 3 Nov 2016 09:59:30 +0100
|
|
Subject: [PATCH xserver v2 4/7] glamor: restore vfunc handlers on init failure
|
|
|
|
In glamor_init(), if the minimum requirements are not met, glamor may
|
|
fail after setting up its own CloseScreen() and DestroyPixmap()
|
|
routines, leading to a crash when either of the two routines is called
|
|
if glamor failed to complete its initialization, e.g:
|
|
|
|
(EE) Backtrace:
|
|
(EE) 0: Xwayland (OsSigHandler+0x29)
|
|
(EE) 1: /lib64/libpthread.so.0 (__restore_rt+0x0)
|
|
(EE) 2: Xwayland (glamor_sync_close+0x2a)
|
|
(EE) 3: Xwayland (glamor_close_screen+0x52)
|
|
(EE) 4: Xwayland (CursorCloseScreen+0x88)
|
|
(EE) 5: Xwayland (AnimCurCloseScreen+0xa4)
|
|
(EE) 6: Xwayland (present_close_screen+0x42)
|
|
(EE) 7: Xwayland (dix_main+0x4f9)
|
|
(EE) 8: /lib64/libc.so.6 (__libc_start_main+0xf1)
|
|
(EE) 9: Xwayland (_start+0x2a)
|
|
|
|
Restore the previous CloseScreen() and DestroyPixmap() vfunc handlers in
|
|
case of failure when checking for the minimum requirements, so that if
|
|
any of the requirement is not met we don't leave the CloseScreen() and
|
|
DestroyPixmap() from glamor handlers in place.
|
|
|
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1390018
|
|
|
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
|
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
|
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
|
---
|
|
glamor/glamor.c | 11 ++++++++---
|
|
1 file changed, 8 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/glamor/glamor.c b/glamor/glamor.c
|
|
index b771832..c54cf3b 100644
|
|
--- a/glamor/glamor.c
|
|
+++ b/glamor/glamor.c
|
|
@@ -470,7 +470,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
|
|
LogMessage(X_WARNING,
|
|
"glamor%d: Failed to allocate screen private\n",
|
|
screen->myNum);
|
|
- goto fail;
|
|
+ goto free_glamor_private;
|
|
}
|
|
|
|
glamor_set_screen_private(screen, glamor_priv);
|
|
@@ -480,7 +480,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
|
|
LogMessage(X_WARNING,
|
|
"glamor%d: Failed to allocate pixmap private\n",
|
|
screen->myNum);
|
|
- goto fail;
|
|
+ goto free_glamor_private;
|
|
}
|
|
|
|
if (!dixRegisterPrivateKey(&glamor_gc_private_key, PRIVATE_GC,
|
|
@@ -488,7 +488,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
|
|
LogMessage(X_WARNING,
|
|
"glamor%d: Failed to allocate gc private\n",
|
|
screen->myNum);
|
|
- goto fail;
|
|
+ goto free_glamor_private;
|
|
}
|
|
|
|
glamor_priv->saved_procs.close_screen = screen->CloseScreen;
|
|
@@ -731,6 +731,11 @@ glamor_init(ScreenPtr screen, unsigned int flags)
|
|
return TRUE;
|
|
|
|
fail:
|
|
+ /* Restore default CloseScreen and DestroyPixmap handlers */
|
|
+ screen->CloseScreen = glamor_priv->saved_procs.close_screen;
|
|
+ screen->DestroyPixmap = glamor_priv->saved_procs.destroy_pixmap;
|
|
+
|
|
+ free_glamor_private:
|
|
free(glamor_priv);
|
|
glamor_set_screen_private(screen, NULL);
|
|
return FALSE;
|
|
--
|
|
2.9.3
|
|
|