From 2fb8da0d5aaa2389ad3fbf5bd15864a69502cb94 Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Thu, 16 Jul 2015 18:41:36 +0200 Subject: [PATCH] backends/monitor-manager: Validate EDID strings Some monitors return a bunch of bytes on their display descriptor which aren't valid utf8 and thus we fail to serialize them later on for the DisplayConfig DBus API. Let's fall back to the stringified product code and serial number in that case. https://bugzilla.gnome.org/show_bug.cgi?id=752673 --- src/backends/meta-monitor-manager.c | 36 ++++++++++++++++++----------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index 7b3fe578a..00e88b0f6 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -1416,25 +1416,35 @@ meta_output_parse_edid (MetaOutput *meta_output, if (parsed_edid) { meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4); - if (parsed_edid->dsc_product_name[0]) - meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14); - else - meta_output->product = g_strdup_printf ("0x%04x", (unsigned) parsed_edid->product_code); - if (parsed_edid->dsc_serial_number[0]) - meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14); - else - meta_output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number); + if (!g_utf8_validate (meta_output->vendor, -1, NULL)) + g_clear_pointer (&meta_output->vendor, g_free); + + meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14); + if (!g_utf8_validate (meta_output->product, -1, NULL) || + meta_output->product[0] == '\0') + { + g_clear_pointer (&meta_output->product, g_free); + meta_output->product = g_strdup_printf ("0x%04x", (unsigned) parsed_edid->product_code); + } + + meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14); + if (!g_utf8_validate (meta_output->serial, -1, NULL) || + meta_output->serial[0] == '\0') + { + g_clear_pointer (&meta_output->serial, g_free); + meta_output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number); + } g_free (parsed_edid); } out: if (!meta_output->vendor) - { - meta_output->vendor = g_strdup ("unknown"); - meta_output->product = g_strdup ("unknown"); - meta_output->serial = g_strdup ("unknown"); - } + meta_output->vendor = g_strdup ("unknown"); + if (!meta_output->product) + meta_output->product = g_strdup ("unknown"); + if (!meta_output->serial) + meta_output->serial = g_strdup ("unknown"); } void