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.
This commit is contained in:
Simon Ser 2022-11-10 12:48:29 +01:00
parent ed71915742
commit 1c4a625fe3

View File

@ -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;
}