From: Christoph Hohmann Date: Fri, 20 Dec 2002 22:23:09 +0000 (+0000) Subject: 0.8.6claws121 X-Git-Tag: rel_0_8_7~13 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=8fa18fb744f18992946100bc61954010ff965789 0.8.6claws121 * src/common/utils.c * src/summaryview.c reimplement expand_search_string using GString to prevent crashs caused by miscalculated string lengths reported by Paul --- diff --git a/ChangeLog.claws b/ChangeLog.claws index 8e054182d..d302c3fd2 100644 --- a/ChangeLog.claws +++ b/ChangeLog.claws @@ -1,3 +1,11 @@ +2002-12-20 [christoph] 0.8.6claws121 + + * src/common/utils.c + * src/summaryview.c + reimplement expand_search_string using GString to + prevent crashs caused by miscalculated string + lengths reported by Paul + 2002-12-20 [christoph] 0.8.6claws120 * src/summaryview.c diff --git a/configure.in b/configure.in index e9afaecd6..52331f313 100644 --- a/configure.in +++ b/configure.in @@ -11,7 +11,7 @@ MINOR_VERSION=8 MICRO_VERSION=6 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=claws120 +EXTRA_VERSION=claws121 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION dnl set $target diff --git a/src/common/utils.c b/src/common/utils.c index 8db501838..8da51b721 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -3006,10 +3006,11 @@ FILE *get_tmpfile_in_dir(const gchar *dir, gchar **filename) /* allow Mutt-like patterns in quick search */ gchar *expand_search_string(const gchar *search_string) { - int i, len, new_len = 0; + int i = 0; gchar term_char, save_char; gchar *cmd_start, *cmd_end; - gchar *new_str = NULL; + GString *matcherstr; + gchar *returnstr = NULL; gchar *copy_str; gboolean casesens, dontmatch; /* list of allowed pattern abbreviations */ @@ -3077,6 +3078,7 @@ gchar *expand_search_string(const gchar *search_string) if (cmds[i].command) return copy_str; + matcherstr = g_string_sized_new(16); cmd_start = cmd_end = copy_str; while (cmd_end && *cmd_end) { /* skip all white spaces */ @@ -3112,26 +3114,15 @@ gchar *expand_search_string(const gchar *search_string) if (!strcmp(cmd_start, cmds[i].abbreviated)) { /* restore character */ *cmd_end = save_char; - len = strlen(cmds[i].command) + 1; - if (dontmatch) - len++; - if (casesens) - len++; /* copy command */ - if (new_str) { - new_len += 1; - new_str = g_realloc(new_str, new_len); - strcat(new_str, " "); + if (matcherstr->len > 0) { + g_string_append(matcherstr, " "); } - new_len += (len + 1); - new_str = g_realloc(new_str, new_len); - if (new_len == len + 1) - *new_str = '\0'; if (dontmatch) - strcat(new_str, "~"); - strcat(new_str, cmds[i].command); - strcat(new_str, " "); + g_string_append(matcherstr, "~"); + g_string_append(matcherstr, cmds[i].command); + g_string_append(matcherstr, " "); /* stop if no params required */ if (cmds[i].numparams == 0) @@ -3160,33 +3151,23 @@ gchar *expand_search_string(const gchar *search_string) save_char = *cmd_end; *cmd_end = '\0'; - new_len += strlen(cmd_start); - - /* do we need to add regexpcase ? */ - if (cmds[i].qualifier) - new_len += 10; /* "regexpcase " */ - - if (term_char != '"') - new_len += 2; - new_str = g_realloc(new_str, new_len); - if (cmds[i].qualifier) { if (casesens) - strcat(new_str, "regexp "); + g_string_append(matcherstr, "regexp "); else - strcat(new_str, "regexpcase "); + g_string_append(matcherstr, "regexpcase "); } /* do we need to add quotes ? */ if (cmds[i].quotes && term_char != '"') - strcat(new_str, "\""); + g_string_append(matcherstr, "\""); /* copy actual parameter */ - strcat(new_str, cmd_start); + g_string_append(matcherstr, cmd_start); /* do we need to add quotes ? */ if (cmds[i].quotes && term_char != '"') - strcat(new_str, "\""); + g_string_append(matcherstr, "\""); /* restore original character */ *cmd_end = save_char; @@ -3202,6 +3183,8 @@ gchar *expand_search_string(const gchar *search_string) } g_free(copy_str); - return new_str; + returnstr = matcherstr->str; + g_string_free(matcherstr, FALSE); + return returnstr; } diff --git a/src/summaryview.c b/src/summaryview.c index 0817a834a..4404cb9a9 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -938,7 +938,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item) MatcherList * tmp_list = NULL; if (search_type == S_SEARCH_EXTENDED) { - char *newstr; + char *newstr = NULL; newstr = expand_search_string(search_string); if (newstr) { @@ -975,13 +975,12 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item) else procmsg_msginfo_free(msginfo); } else { - if (tmp_list != NULL && matcherlist_match(tmp_list, msginfo)) + if ((tmp_list != NULL) && matcherlist_match(tmp_list, msginfo)) not_killed = g_slist_append(not_killed, msginfo); else procmsg_msginfo_free(msginfo); } } - if (search_type == S_SEARCH_EXTENDED && tmp_list != NULL) { matcherlist_free(tmp_list); tmp_list = NULL;