[gnome-flashback] display-config: validate EDID strings



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]