From dbf1edefdfec45eb21e35c6c45f282bdabdfb4e6 Mon Sep 17 00:00:00 2001 From: Robert Obkircher Date: Thu, 23 Nov 2023 19:12:05 +0100 Subject: [PATCH] output-xrandr: Ignore duplicate modes reported by xrandr This fixes an issue where xrandr reports the preferred mode of an internal laptop display twice. This triggered an assertion that crashed GDM, because meta_monitor_normal_generate_modes assumes that the list of display nodes doesn't contain duplicate pointers to the preferred one. Closes: Part-of: --- src/backends/x11/meta-output-xrandr.c | 28 +++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/backends/x11/meta-output-xrandr.c b/src/backends/x11/meta-output-xrandr.c index d9f7216d5..5b9b70ed4 100644 --- a/src/backends/x11/meta-output-xrandr.c +++ b/src/backends/x11/meta-output-xrandr.c @@ -835,6 +835,21 @@ output_info_init_tile_info (MetaOutputInfo *output_info, XFree (prop); } +static gboolean +sanity_check_duplicate (MetaCrtcMode **modes, + size_t n_modes, + MetaCrtcMode *mode) +{ + size_t i; + + for (i = 0; i < n_modes; i++) + { + if (meta_crtc_mode_get_id (modes[i]) == meta_crtc_mode_get_id (mode)) + return FALSE; + } + + return TRUE; +} static void output_info_init_modes (MetaOutputInfo *output_info, @@ -857,8 +872,17 @@ output_info_init_modes (MetaOutputInfo *output_info, if (xrandr_output->modes[i] == (XID) meta_crtc_mode_get_id (mode)) { - output_info->modes[n_actual_modes] = mode; - n_actual_modes += 1; + if (sanity_check_duplicate (output_info->modes, n_actual_modes, mode)) + { + output_info->modes[n_actual_modes] = mode; + n_actual_modes += 1; + } + else + { + g_warning ("X11 server advertized duplicate identical modes " + "(0x%" G_GINT64_MODIFIER "x)", + meta_crtc_mode_get_id (mode)); + } break; } }