Revision: 497 Author: eht16 Date: 2006-06-27 13:43:04 -0700 (Tue, 27 Jun 2006) ViewCVS: http://svn.sourceforge.net/geany/?rev=497&view=rev
Log Message: ----------- Fixed a crash when auto completion or call tips are used if no filetype was set. Added some sanity checks.
Modified Paths: -------------- trunk/ChangeLog trunk/src/sci_cb.c Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-06-27 17:07:22 UTC (rev 496) +++ trunk/ChangeLog 2006-06-27 20:43:04 UTC (rev 497) @@ -6,6 +6,8 @@ Add support for parsing compiler output for LaTeX with latex's --file-line-error-style command line argument. Removed unneeded function utils_free_ptr_array(). + * src/sci_cb.c: Fixed a crash when auto completion or call tips are + used if no filetype was set. Added some sanity checks.
2006-06-27 Nick Treleaven nick.treleaven@btinternet.com
Modified: trunk/src/sci_cb.c =================================================================== --- trunk/src/sci_cb.c 2006-06-27 17:07:22 UTC (rev 496) +++ trunk/src/sci_cb.c 2006-06-27 20:43:04 UTC (rev 497) @@ -359,7 +359,8 @@ lexer = SSM(sci, SCI_GETLEXER, 0, 0); idx = document_find_by_sci(sci); - + if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return FALSE; + word[0] = '\0'; if (pos == -1) { // position of '(' is unknown, so go backwards to find it @@ -388,16 +389,8 @@
gboolean sci_cb_start_auto_complete(ScintillaObject *sci, gint pos) { - gint line = sci_get_line_from_position(sci, pos); - gint line_start = sci_get_position_from_line(sci, line); - gint line_len = sci_get_line_length(sci, line); - gint line_pos = pos - line_start - 1; - gint current = pos - line_start; - gint rootlen; - gint startword = current, lexer = SSM(sci, SCI_GETLEXER, 0, 0); - gint style = SSM(sci, SCI_GETSTYLEAT, pos, 0); - gchar linebuf[line_len + 1]; - gchar *root; + gint line, line_start, line_len, line_pos, current, rootlen, startword, lexer, style; + gchar *linebuf, *root; const GPtrArray *tags;
if (sci == NULL) return FALSE; @@ -407,7 +400,8 @@ line_len = sci_get_line_length(sci, line); line_pos = pos - line_start - 1; current = pos - line_start; - startword = current, lexer = SSM(sci, SCI_GETLEXER, 0, 0); + startword = current; + lexer = SSM(sci, SCI_GETLEXER, 0, 0); style = SSM(sci, SCI_GETSTYLEAT, pos, 0);
//if (lexer != SCLEX_CPP && lexer != SCLEX_HTML && lexer != SCLEX_PASCAL) return FALSE; @@ -415,6 +409,7 @@ if (lexer == SCLEX_CPP && (style == SCE_C_COMMENT || style == SCE_C_COMMENTLINE || style == SCE_C_COMMENTDOC)) return FALSE;
+ linebuf = g_malloc(line_len + 1); sci_get_line(sci, line, linebuf);
// find the start of the current word @@ -448,8 +443,18 @@ gint idx = document_find_by_sci(sci); TMTagAttrType attrs[] = { tm_tag_attr_name_t, 0 };
+ if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) + { // go home if typed less than 4 chars + g_free(linebuf); + return FALSE; + } + while ((line_pos - i >= 0) && ! g_ascii_isspace(linebuf[line_pos - i])) i++; - if (i < 4) return FALSE; // go home if typed less than 4 chars + if (i < 4) + { // go home if typed less than 4 chars + g_free(linebuf); + return FALSE; + }
tags = tm_workspace_find(root, tm_tag_max_t, attrs, TRUE, doc_list[idx].file_type->lang); if (NULL != tags && tags->len > 0) @@ -467,6 +472,7 @@ g_string_free(words, TRUE); } } + g_free(linebuf); return TRUE; }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.