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: <https://gitlab.gnome.org/GNOME/mutter/-/issues/2945>
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3176>
This commit is contained in:
Robert Obkircher 2023-11-23 19:12:05 +01:00
parent efddf28925
commit dbf1edefdf

View File

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