[mutter] backends/monitor-manager: Validate EDID strings



commit 2fb8da0d5aaa2389ad3fbf5bd15864a69502cb94
Author: Rui Matos <tiagomatos gmail com>
Date:   Thu Jul 16 18:41:36 2015 +0200

    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 files changed, 23 insertions(+), 13 deletions(-)
---
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 7b3fe57..00e88b0 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]