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 /backend/drm/backend.c | |
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.
Diffstat (limited to 'backend/drm/backend.c')
-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; } |