Revision: 2747 http://geany.svn.sourceforge.net/geany/?rev=2747&view=rev Author: ntrel Date: 2008-07-03 07:39:49 -0700 (Thu, 03 Jul 2008)
Log Message: ----------- Fix memory leak in utils_find_open_xml_tag() when size < 3, and only allocate string when '<' found. Factor insert_closing_tag() from handle_xml(), fixing a memory leak when ignoring tags like <br>.
Modified Paths: -------------- trunk/ChangeLog trunk/src/editor.c trunk/src/utils.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2008-07-03 14:01:47 UTC (rev 2746) +++ trunk/ChangeLog 2008-07-03 14:39:49 UTC (rev 2747) @@ -1,3 +1,12 @@ +2008-07-03 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/utils.c, src/editor.c: + Fix memory leak in utils_find_open_xml_tag() when size < 3, and only + allocate string when '<' found. + Factor insert_closing_tag() from handle_xml(), fixing a memory leak + when ignoring tags like <br>. + + 2008-07-03 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/utils.c:
Modified: trunk/src/editor.c =================================================================== --- trunk/src/editor.c 2008-07-03 14:01:47 UTC (rev 2746) +++ trunk/src/editor.c 2008-07-03 14:39:49 UTC (rev 2747) @@ -1615,6 +1615,36 @@ }
+static void insert_closing_tag(GeanyDocument *doc, gint pos, gchar ch, const gchar *tag_name) +{ + ScintillaObject *sci = doc->sci; + gchar *to_insert = NULL; + + if (ch == '/') + { + const gchar *gt = ">"; + /* if there is already a '>' behind the cursor, don't add it */ + if (sci_get_char_at(sci, pos) == '>') + gt = ""; + + to_insert = g_strconcat(tag_name, gt, NULL); + } + else + to_insert = g_strconcat("</", tag_name, ">", NULL); + + sci_start_undo_action(sci); + sci_replace_sel(sci, to_insert); + if (ch == '>') + { + SSM(sci, SCI_SETSEL, pos, pos); + if (utils_str_equal(tag_name, "table")) + editor_auto_table(doc, pos); + } + sci_end_undo_action(sci); + g_free(to_insert); +} + + /* * (stolen from anjuta and heavily modified) * This routine will auto complete XML or HTML tags that are still open by closing them @@ -1627,6 +1657,7 @@ gint lexer = SSM(sci, SCI_GETLEXER, 0, 0); gint pos, min; gchar *str_found, sel[512]; + gboolean result = FALSE;
/* If the user has turned us off, quit now. * This may make sense only in certain languages */ @@ -1675,39 +1706,15 @@ || utils_str_equal(str_found, "area") || utils_str_equal(str_found, "meta")) { - return FALSE; + /* ignore tag */ } - - if (*str_found != '\0') + else if (*str_found != '\0') { - gchar *to_insert; - if (ch == '/') - { - gchar *gt = ">"; - /* if there is already a '>' behind the cursor, don't add it */ - if (sci_get_char_at(sci, pos) == '>') - gt = ""; - - to_insert = g_strconcat(str_found, gt, NULL); - } - else - to_insert = g_strconcat("</", str_found, ">", NULL); - sci_start_undo_action(sci); - sci_replace_sel(sci, to_insert); - if (ch == '>') - { - SSM(sci, SCI_SETSEL, pos, pos); - if (utils_str_equal(str_found, "table")) - editor_auto_table(doc, pos); - } - sci_end_undo_action(sci); - g_free(to_insert); - g_free(str_found); - return TRUE; + insert_closing_tag(doc, pos, ch, str_found); + result = TRUE; } - g_free(str_found); - return FALSE; + return result; }
Modified: trunk/src/utils.c =================================================================== --- trunk/src/utils.c 2008-07-03 14:01:47 UTC (rev 2746) +++ trunk/src/utils.c 2008-07-03 14:39:49 UTC (rev 2747) @@ -244,12 +244,11 @@
/* * (stolen from anjuta and modified) - * Search backward through size bytes looking for a '<', then return the tag if any + * Search backward through size bytes looking for a '<', then return the tag, if any. * @return The tag name */ gchar *utils_find_open_xml_tag(const gchar sel[], gint size, gboolean check_tag) { - GString *result = g_string_sized_new(64); const gchar *begin, *cur;
if (size < 3) @@ -272,16 +271,18 @@
if (*cur == '<') { + GString *result = g_string_sized_new(64); + cur++; - while((strchr(":_-.", *cur) || isalnum(*cur))) + while (strchr(":_-.", *cur) || isalnum(*cur)) { g_string_append_c(result, *cur); cur++; } + return g_string_free(result, FALSE); }
- /* Return the tag name or "" */ - return g_string_free(result, FALSE); + return NULL; }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.