diff options
author | Simon Ser <contact@emersion.fr> | 2022-11-10 12:48:29 +0100 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2022-11-11 22:44:53 +0000 |
commit | 1c4a625fe3e6bc3317d3e1816eee4a701a36c588 (patch) | |
tree | 7cfcf922fa92211ad5e18a2344d1a42bf193be72 | |
parent | ed71915742160f2b9157adbad79364e22ab7ebda (diff) |
backend/drm: ensure disconnected outputs are disabled after VT switch
The following situation can be dangerous:
- Output DP-1 is plugged in, compositor enables it.
- User VT switches away.
- User unplugs DP-1.
- User VT switches back.
- scan_drm_connectors() figures out the output is now disconnected,
uninitializes the struct wlr_output.
- The loop restoring previous output state in handle_session_active()
accesses the struct wlr_output to figure out what to restore.
By chance, we zero out the struct wlr_output after uninitializing it,
so enabled and current_mode will always be zero. But let's make sure
we handle this case explicitly, to remind future readers that it exists
and make the code less fragile.
-rw-r--r-- | backend/drm/backend.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/backend/drm/backend.c b/backend/drm/backend.c index a7400eab..fc383832 100644 --- a/backend/drm/backend.c +++ b/backend/drm/backend.c @@ -107,7 +107,8 @@ static void handle_session_active(struct wl_listener *listener, void *data) { wl_list_for_each(conn, &drm->outputs, link) { struct wlr_output_mode *mode = NULL; uint32_t committed = WLR_OUTPUT_STATE_ENABLED; - if (conn->output.enabled && conn->output.current_mode != NULL) { + if (conn->status != DRM_MODE_DISCONNECTED && conn->output.enabled + && conn->output.current_mode != NULL) { committed |= WLR_OUTPUT_STATE_MODE; mode = conn->output.current_mode; } |