SF.net SVN: geany:[4247] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Sun Sep 27 16:38:38 UTC 2009


Revision: 4247
          http://geany.svn.sourceforge.net/geany/?rev=4247&view=rev
Author:   ntrel
Date:     2009-09-27 16:38:37 +0000 (Sun, 27 Sep 2009)

Log Message:
-----------
Fix possible segfault in get_keyfile_int() if key value is malformed.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/highlighting.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-09-27 16:16:18 UTC (rev 4246)
+++ trunk/ChangeLog	2009-09-27 16:38:37 UTC (rev 4247)
@@ -26,6 +26,8 @@
    Change new html_asp_default_language markup pref to use integer,
    not hex in config file.
    Fix minor issue with changing pref back to 0.
+ * src/highlighting.c:
+   Fix possible segfault in get_keyfile_int() if key value is malformed.
 
 
 2009-09-24  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>

Modified: trunk/src/highlighting.c
===================================================================
--- trunk/src/highlighting.c	2009-09-27 16:16:18 UTC (rev 4246)
+++ trunk/src/highlighting.c	2009-09-27 16:38:37 UTC (rev 4247)
@@ -350,15 +350,24 @@
 }
 
 
-/* Get first and second integer numbers, store in foreground and background fields of @a style.
- * FIXME: is not safe for badly formed key e.g. "key=" */
+static void convert_int(const gchar *int_str, gint *val)
+{
+	gchar *end;
+	gint v = strtol(int_str, &end, 10);
+
+	if (int_str != end)
+		*val = v;
+}
+
+
+/* Get first and second integer numbers, store in foreground and background fields of @a style. */
 static void get_keyfile_int(GKeyFile *config, GKeyFile *configh, const gchar *section,
 							const gchar *key, gint fdefault_val, gint sdefault_val,
 							GeanyLexerStyle *style)
 {
 	gchar **list;
-	gchar *end1, *end2;
 	gsize len;
+	GeanyLexerStyle def = {fdefault_val, sdefault_val, FALSE, FALSE};
 
 	g_return_if_fail(config);
 	g_return_if_fail(configh);
@@ -369,21 +378,18 @@
 	if (list == NULL)
 		list = g_key_file_get_string_list(config, section, key, &len, NULL);
 
-	if (G_LIKELY(list != NULL) && G_LIKELY(list[0] != NULL))
-		style->foreground = strtol(list[0], &end1, 10);
-	else
-		style->foreground = fdefault_val;
-	if (G_LIKELY(list != NULL) && G_LIKELY(list[1] != NULL))
-		style->background = strtol(list[1], &end2, 10);
-	else
-		style->background = sdefault_val;
+	*style = def;
+	if (!list)
+		return;
 
-	/* if there was an error, strtol() returns 0 and end is list[x], so then we use default_val */
-	if (G_UNLIKELY(list == NULL) || G_UNLIKELY(list[0] == end1))
-		style->foreground = fdefault_val;
-	if (G_UNLIKELY(list == NULL) || G_UNLIKELY(list[1] == end2))
-		style->background = sdefault_val;
-
+	if (list[0])
+	{
+		convert_int(list[0], &style->foreground);
+		if (list[1])
+		{
+			convert_int(list[1], &style->background);
+		}
+	}
 	g_strfreev(list);
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list