[gnome-color-manager] trivial: make the EDID code more resistant to broken data



commit a1c009662eb7bd525d86a9b0d3583228054f0c52
Author: Richard Hughes <richard hughsie com>
Date:   Fri Nov 27 12:30:41 2009 +0000

    trivial: make the EDID code more resistant to broken data

 src/gcm-edid.c |   24 +++++++++++++++---------
 1 files changed, 15 insertions(+), 9 deletions(-)
---
diff --git a/src/gcm-edid.c b/src/gcm-edid.c
index 4e263f8..be167d5 100644
--- a/src/gcm-edid.c
+++ b/src/gcm-edid.c
@@ -171,16 +171,16 @@ gcm_edid_parse (GcmEdid *edid, const guint8 *data, GError **error)
 
 		/* any useful blocks? */
 		if (data[i+3] == GCM_DESCRIPTOR_DISPLAY_PRODUCT_NAME) {
-			priv->monitor_name = g_strdup ((const gchar *) &data[i+5]);
+			priv->monitor_name = g_strndup ((const gchar *) &data[i+5], 12);
 			egg_debug ("[extended EDID block] monitor name: %s", priv->monitor_name);
 		} else if (data[i+3] == GCM_DESCRIPTOR_DISPLAY_PRODUCT_SERIAL_NUMBER) {
 			g_free (priv->serial_number);
-			priv->serial_number = g_strdup ((const gchar *) &data[i+5]);
+			priv->serial_number = g_strndup ((const gchar *) &data[i+5], 12);
 			egg_debug ("[extended EDID block] serial number: %s", priv->serial_number);
 		} else if (data[i+3] == GCM_DESCRIPTOR_COLOR_MANAGEMENT_DATA) {
 			egg_warning ("failing to parse color management data");
 		} else if (data[i+3] == GCM_DESCRIPTOR_ALPHANUMERIC_DATA_STRING) {
-			priv->ascii_string = g_strdup ((const gchar *) &data[i+5]);
+			priv->ascii_string = g_strndup ((const gchar *) &data[i+5], 12);
 			egg_debug ("[extended EDID block] ascii string: %s", priv->ascii_string);
 		} else if (data[i+3] == GCM_DESCRIPTOR_COLOR_POINT) {
 			if (data[i+3+9] != 0xff) {
@@ -202,12 +202,18 @@ gcm_edid_parse (GcmEdid *edid, const guint8 *data, GError **error)
 		egg_warning ("%i extension blocks to parse", extension_blocks);
 
 	/* remove embedded newlines */
-	if (priv->monitor_name != NULL)
-		g_strdelimit (priv->monitor_name, "\n", '\0');
-	if (priv->serial_number != NULL)
-		g_strdelimit (priv->serial_number, "\n", '\0');
-	if (priv->ascii_string != NULL)
-		g_strdelimit (priv->ascii_string, "\n", '\0');
+	if (priv->monitor_name != NULL) {
+		g_strchomp (priv->monitor_name);
+		g_strdelimit (priv->monitor_name, "\n\r", '\0');
+	}
+	if (priv->serial_number != NULL) {
+		g_strchomp (priv->serial_number);
+		g_strdelimit (priv->serial_number, "\n\r", '\0');
+	}
+	if (priv->ascii_string != NULL) {
+		g_strchomp (priv->ascii_string);
+		g_strdelimit (priv->ascii_string, "\n\r", '\0');
+	}
 out:
 	return ret;
 }



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