xwayland: Do not set root clip when rootless

Otherwise the server may try to draw onto the root window when closing
down, but when running rootless the root window has no storage thus
causing a memory corruption.

Thanks to Adam Jackson <ajax@redhat.com> for helping tracking this down!

Reviewed-by: Adam Jackson <ajax@redhat.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93045
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Tested-by: Marek Chalupa <mchqwerty@gmail.com>
This commit is contained in:
Olivier Fourdan 2015-11-23 08:51:48 +01:00 committed by Adam Jackson
parent 5b2ca34132
commit 51a4399b94
3 changed files with 10 additions and 4 deletions

View File

@ -233,9 +233,11 @@ xwl_glamor_create_screen_resources(ScreenPtr screen)
if (!ret) if (!ret)
return ret; return ret;
if (xwl_screen->rootless) if (xwl_screen->rootless) {
screen->devPrivate = screen->devPrivate =
fbCreatePixmap(screen, 0, 0, screen->rootDepth, 0); fbCreatePixmap(screen, 0, 0, screen->rootDepth, 0);
SetRootClip(screen, FALSE);
}
else { else {
screen->devPrivate = screen->devPrivate =
xwl_glamor_create_pixmap(screen, screen->width, screen->height, xwl_glamor_create_pixmap(screen, screen->width, screen->height,

View File

@ -186,7 +186,7 @@ output_handle_done(void *data, struct wl_output *wl_output)
--xwl_screen->expecting_event; --xwl_screen->expecting_event;
} }
if (xwl_screen->screen->root) if (!xwl_screen->rootless)
SetRootClip(xwl_screen->screen, FALSE); SetRootClip(xwl_screen->screen, FALSE);
xwl_screen->width = width; xwl_screen->width = width;
@ -206,11 +206,13 @@ output_handle_done(void *data, struct wl_output *wl_output)
if (xwl_screen->screen->root) { if (xwl_screen->screen->root) {
xwl_screen->screen->root->drawable.width = width; xwl_screen->screen->root->drawable.width = width;
xwl_screen->screen->root->drawable.height = height; xwl_screen->screen->root->drawable.height = height;
SetRootClip(xwl_screen->screen, TRUE);
RRScreenSizeNotify(xwl_screen->screen); RRScreenSizeNotify(xwl_screen->screen);
} }
update_desktop_dimensions(); update_desktop_dimensions();
if (!xwl_screen->rootless)
SetRootClip(xwl_screen->screen, TRUE);
} }
static void static void

View File

@ -279,9 +279,11 @@ xwl_shm_create_screen_resources(ScreenPtr screen)
if (!ret) if (!ret)
return ret; return ret;
if (xwl_screen->rootless) if (xwl_screen->rootless) {
screen->devPrivate = screen->devPrivate =
fbCreatePixmap(screen, 0, 0, screen->rootDepth, 0); fbCreatePixmap(screen, 0, 0, screen->rootDepth, 0);
SetRootClip(screen, FALSE);
}
else else
screen->devPrivate = screen->devPrivate =
xwl_shm_create_pixmap(screen, screen->width, screen->height, xwl_shm_create_pixmap(screen, screen->width, screen->height,