From 60c7d9e5cfacf1bed62d355fb70aa2c4361c2a1a Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Fri, 5 Jun 2009 15:59:58 +0000 Subject: [PATCH] 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. git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@3843 ea778897-0a13-0410-b9d1-a72fbfd435f5 --- ChangeLog | 5 ++++ data/filetypes.common | 4 +-- src/highlighting.c | 70 +++++++++++++++++++++++++++---------------- src/utils.c | 3 +- 4 files changed, 53 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index f9cb3cec..9c48b8a6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/data/filetypes.common b/data/filetypes.common index a40b452f..940bbba2 100644 --- a/data/filetypes.common +++ b/data/filetypes.common @@ -18,7 +18,7 @@ margin_folding=0x000000;0xdfdfdf;false;false # 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 @@ marker_translucency=256;256;false;false # 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 diff --git a/src/highlighting.c b/src/highlighting.c index 132331af..0cd8fd99 100644 --- a/src/highlighting.c +++ b/src/highlighting.c @@ -233,42 +233,59 @@ static gint rotate_rgb(gint color) } -/* 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 @@ static void get_keyfile_hex(GKeyFile *config, GKeyFile *configh, } +/* 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) diff --git a/src/utils.c b/src/utils.c index 448ab79e..a579a2c3 100644 --- a/src/utils.c +++ b/src/utils.c @@ -943,7 +943,8 @@ gchar *utils_make_human_readable_str(guint64 size, gulong block_size, /* 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;