aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2022-11-10 12:48:29 +0100
committerSimon Ser <contact@emersion.fr>2022-11-11 22:44:53 +0000
commit1c4a625fe3e6bc3317d3e1816eee4a701a36c588 (patch)
tree7cfcf922fa92211ad5e18a2344d1a42bf193be72
parented71915742160f2b9157adbad79364e22ab7ebda (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.c3
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;
}