Revision: 3843 http://geany.svn.sourceforge.net/geany/?rev=3843&view=rev Author: ntrel Date: 2009-06-05 15:59:58 +0000 (Fri, 05 Jun 2009)
Log Message: ----------- Fix segfault on parsing a filetypes.* style definition that has < 4 fields. Allow style definitions to have missing fields to use the default style fields.
Modified Paths: -------------- trunk/ChangeLog trunk/data/filetypes.common trunk/src/highlighting.c trunk/src/utils.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-06-05 15:57:01 UTC (rev 3842) +++ trunk/ChangeLog 2009-06-05 15:59:58 UTC (rev 3843) @@ -6,6 +6,11 @@ * src/editor.c: Fix redrawing due to colourising just after the document is first drawn. Now colourising should happen before the first draw. + * src/utils.c, src/highlighting.c, data/filetypes.common: + Fix segfault on parsing a filetypes.* style definition that has < 4 + fields. + Allow style definitions to have missing fields to use the default + style fields.
2009-06-05 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
Modified: trunk/data/filetypes.common =================================================================== --- trunk/data/filetypes.common 2009-06-05 15:57:01 UTC (rev 3842) +++ trunk/data/filetypes.common 2009-06-05 15:59:58 UTC (rev 3843) @@ -18,7 +18,7 @@
# background colour of the current line, only the second and third argument is interpreted # use the third argument to enable or disable the highlighting of the current line (has to be true/false) -current_line=0x0;0xf0f0f0;true;false +current_line=0x000000;0xf0f0f0;true;false
# translucency for the current line(first argument) and the selection (second argument) # values between 0 and 256 are accepted. Note for Windows 95, 98 and ME users: @@ -40,7 +40,7 @@
# colour of the caret(the blinking cursor), only first and third argument is interpreted # set the third argument to true to change the caret into a block caret -caret=0x000000;0x0;false;false +caret=0x000000;0x000000;false;false
# width of the caret(the blinking cursor), only first argument is interpreted # width in pixels, use 0 to make it invisible, maximum width is 3
Modified: trunk/src/highlighting.c =================================================================== --- trunk/src/highlighting.c 2009-06-05 15:57:01 UTC (rev 3842) +++ trunk/src/highlighting.c 2009-06-05 15:59:58 UTC (rev 3843) @@ -233,42 +233,59 @@ }
-/* FIXME: is not safe for badly formed key e.g. "key='" */ +static void parse_color(const gchar *str, gint *clr) +{ + gint c; + + /* ignore empty strings */ + if (!NZV(str)) + return; + + c = utils_strtod(str, NULL, FALSE); + if (c > -1) + { + *clr = c; + return; + } + geany_debug("Bad color '%s'", str); +} + + static void parse_keyfile_style(gchar **list, const GeanyLexerStyle *default_style, GeanyLexerStyle *style) { + gsize len; + gchar *str; + g_return_if_fail(default_style); g_return_if_fail(style);
- if (G_LIKELY(list != NULL) && G_UNLIKELY(list[0] != NULL)) + *style = *default_style; + style->foreground = rotate_rgb(default_style->foreground); + style->background = rotate_rgb(default_style->background); + + if (!list) + return; + + len = g_strv_length(list); + + str = list[0]; + if (len == 1 && isalpha(str[0])) + read_named_style(str, style); + else { - gchar *str = list[0]; - - if (list[1] == NULL && isalpha(str[0])) + switch (len) { - read_named_style(str, style); - return; + case 4: + style->italic = utils_atob(list[3]); + case 3: + style->bold = utils_atob(list[2]); + case 2: + parse_color(list[1], &style->background); + case 1: + parse_color(list[0], &style->foreground); } - else - style->foreground = (gint) utils_strtod(str, NULL, FALSE); } - else - style->foreground = rotate_rgb(default_style->foreground); - - if (G_LIKELY(list != NULL) && G_LIKELY(list[1] != NULL)) - style->background = (gint) utils_strtod(list[1], NULL, FALSE); - else - style->background = rotate_rgb(default_style->background); - - if (G_LIKELY(list != NULL) && G_LIKELY(list[2] != NULL)) - style->bold = utils_atob(list[2]); - else - style->bold = default_style->bold; - - if (G_LIKELY(list != NULL) && list[3] != NULL) - style->italic = utils_atob(list[3]); - else - style->italic = default_style->italic; }
@@ -304,6 +321,7 @@ }
+/* FIXME: is not safe for badly formed key e.g. "key=" */ static void get_keyfile_int(GKeyFile *config, GKeyFile *configh, const gchar *section, const gchar *key, gint fdefault_val, gint sdefault_val, GeanyLexerStyle *style)
Modified: trunk/src/utils.c =================================================================== --- trunk/src/utils.c 2009-06-05 15:57:01 UTC (rev 3842) +++ trunk/src/utils.c 2009-06-05 15:59:58 UTC (rev 3843) @@ -943,7 +943,8 @@
/* utils_strtod() converts a string containing a hex colour ("0x00ff00") into an integer. * Basically, it is the same as strtod() would do, but it does not understand hex colour values, - * before ANSI-C99. With with_route set, it takes strings of the format "#00ff00". */ + * before ANSI-C99. With with_route set, it takes strings of the format "#00ff00". + * Returns -1 on failure. */ gint utils_strtod(const gchar *source, gchar **end, gboolean with_route) { guint red, green, blue, offset = 0;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.