[PATCH weston] compositor-drm: Fix a crash with a fullscreen surface with driver mode

Ander Conselvan de Oliveira ander.conselvan.de.oliveira at intel.com
Tue Feb 26 03:44:58 PST 2013

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().

 src/compositor-drm.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index a824324..3922e0c 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -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,

More information about the wayland-devel mailing list