[gnome-flashback] display-config: validate EDID strings
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] display-config: validate EDID strings
- Date: Sun, 23 Aug 2015 08:12:31 +0000 (UTC)
commit 3072d1960572a9a9bf7cd349ae8a4a3460e1cf20
Author: Rui Matos <tiagomatos gmail com>
Date: Thu Jul 16 18:41:36 2015 +0200
display-config: 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
.../libdisplay-config/flashback-monitor-manager.c | 36 ++++++++++++-------
1 files changed, 23 insertions(+), 13 deletions(-)
---
diff --git a/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
b/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
index f72044a..55470ce 100644
--- a/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
+++ b/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
@@ -1975,25 +1975,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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]