mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-10-15 14:42:26 +00:00
compositor-drm: Fix a crash with a fullscreen surface with driver mode
If there was a fullscreen surface using driver mode when a vt switch is triggered, but something caused it to be gone when switching back (such as the client being killed), a call to drm_output_switch_mode() is made to restore the old mode, and that sets the output's current drm_fb to NULL, so that the new mode is set drm_output_repaint(). This led to a crash in vt_func(), because it tried to access output->current for restoring the old mode. Fix this by not setting the mode if there's no current fb. Instead, schedule a repaint so that the mode is set in drm_output_repaint(). https://bugs.freedesktop.org/show_bug.cgi?id=60675
This commit is contained in:
parent
8eb6748f15
commit
2002f88888
|
@ -1973,6 +1973,16 @@ drm_compositor_set_modes(struct drm_compositor *compositor)
|
|||
int ret;
|
||||
|
||||
wl_list_for_each(output, &compositor->base.output_list, base.link) {
|
||||
if (!output->current) {
|
||||
/* If something that would cause the output to
|
||||
* switch mode happened while in another vt, we
|
||||
* might not have a current drm_fb. In that case,
|
||||
* schedule a repaint and let drm_output_repaint
|
||||
* handle setting the mode. */
|
||||
weston_output_schedule_repaint(&output->base);
|
||||
continue;
|
||||
}
|
||||
|
||||
drm_mode = (struct drm_mode *) output->base.current;
|
||||
ret = drmModeSetCrtc(compositor->drm.fd, output->crtc_id,
|
||||
output->current->fb_id, 0, 0,
|
||||
|
|
Loading…
Reference in a new issue