talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 814b087c9100bd6820bd67f8502286517f37de75
parent 4311a38be85f5054a22c5be5605720fce867421d
Author: Andrej Kacian <ticho@claws-mail.org>
Date:   Tue, 11 Jul 2017 18:37:54 +0200

Fix several memory leaks around template parsing.

FLEX-generated quote_fmt_scan_string() allocates a buffer
(and actually returns a pointer to it, although its prototype
in quote_fmt.h says its return value is void), which needs
to be cleaned up afterwards.

Diffstat:
Msrc/compose.c | 34++++++++++++++++++++++++++++++++++
Msrc/prefs_template.c | 2++
Msrc/quote_fmt.h | 1+
3 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/src/compose.c b/src/compose.c @@ -1084,6 +1084,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI else gtk_entry_set_text(GTK_ENTRY(compose->from_name), buf); quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); g_free(tmp); } @@ -1177,6 +1178,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI gtk_entry_set_text(GTK_ENTRY(compose->subject_entry), buf); compose_attach_from_list(compose, quote_fmt_get_attachments_list(), FALSE); quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); g_free(subject); g_free(tmp); @@ -1652,6 +1654,7 @@ static Compose *compose_generic_reply(MsgInfo *msginfo, else gtk_entry_set_text(GTK_ENTRY(compose->from_name), buf); quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); g_free(tmp); } @@ -1834,6 +1837,7 @@ Compose *compose_forward(PrefsAccount *account, MsgInfo *msginfo, else gtk_entry_set_text(GTK_ENTRY(compose->from_name), buf); quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); g_free(tmp); procmsg_msginfo_free(&full_msginfo); @@ -2025,6 +2029,7 @@ static Compose *compose_forward_multiple(PrefsAccount *account, GSList *msginfo_ else gtk_entry_set_text(GTK_ENTRY(compose->from_name), buf); quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); g_free(tmp); } @@ -3125,6 +3130,10 @@ static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo, quote_fmt_parse(); buf = quote_fmt_get_buffer(); + + quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); + if (buf == NULL) alertpanel_error(_("The \"Quotation mark\" of the template is invalid.")); else @@ -3158,11 +3167,18 @@ static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo, } buf = quote_fmt_get_buffer(); + if (buf == NULL) { gint line = quote_fmt_get_line(); alertpanel_error(err_msg, line); + quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); + goto error; } + quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); + } else buf = ""; @@ -8882,6 +8898,9 @@ static void compose_template_apply_fields(Compose *compose, Template *tmpl) } else { gtk_entry_set_text(GTK_ENTRY(compose->from_name), buf); } + + quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); } if (tmpl->to && *tmpl->to != '\0') { @@ -8900,6 +8919,9 @@ static void compose_template_apply_fields(Compose *compose, Template *tmpl) } else { compose_entry_append(compose, buf, COMPOSE_TO, PREF_TEMPLATE); } + + quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); } if (tmpl->cc && *tmpl->cc != '\0') { @@ -8918,6 +8940,9 @@ static void compose_template_apply_fields(Compose *compose, Template *tmpl) } else { compose_entry_append(compose, buf, COMPOSE_CC, PREF_TEMPLATE); } + + quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); } if (tmpl->bcc && *tmpl->bcc != '\0') { @@ -8936,6 +8961,9 @@ static void compose_template_apply_fields(Compose *compose, Template *tmpl) } else { compose_entry_append(compose, buf, COMPOSE_BCC, PREF_TEMPLATE); } + + quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); } if (tmpl->replyto && *tmpl->replyto != '\0') { @@ -8954,6 +8982,9 @@ static void compose_template_apply_fields(Compose *compose, Template *tmpl) } else { compose_entry_append(compose, buf, COMPOSE_REPLYTO, PREF_TEMPLATE); } + + quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); } /* process the subject */ @@ -8973,6 +9004,9 @@ static void compose_template_apply_fields(Compose *compose, Template *tmpl) } else { gtk_entry_set_text(GTK_ENTRY(compose->subject_entry), buf); } + + quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); } procmsg_msginfo_free( &dummyinfo ); diff --git a/src/prefs_template.c b/src/prefs_template.c @@ -714,9 +714,11 @@ gboolean prefs_template_string_is_valid(gchar *string, gint *line, gboolean esca if (!parsed_buf) { if (line) *line = quote_fmt_get_line(); + quote_fmtlex_destroy(); return FALSE; } quote_fmt_reset_vartable(); + quote_fmtlex_destroy(); } return result; } diff --git a/src/quote_fmt.h b/src/quote_fmt.h @@ -45,6 +45,7 @@ void quote_fmt_init(MsgInfo *info, const gchar *my_quote_str, gboolean escaped_string); #endif gint quote_fmtparse(void); +int quote_fmtlex_destroy(void); void quote_fmt_scan_string(const gchar *str); void quote_fmt_reset_vartable(void); gint quote_fmt_get_cursor_pos(void);