SF.net SVN: geany: [861] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Mon Oct 2 15:22:38 UTC 2006


Revision: 861
          http://svn.sourceforge.net/geany/?rev=861&view=rev
Author:   ntrel
Date:     2006-10-02 08:22:29 -0700 (Mon, 02 Oct 2006)

Log Message:
-----------
Change sci_get_line to return a NULL terminated string.
Fix memory leak and possible invalid read in sci_cb_auto_latex().

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/callbacks.c
    trunk/src/document.c
    trunk/src/sci_cb.c
    trunk/src/sciwrappers.c
    trunk/src/sciwrappers.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-10-02 11:31:54 UTC (rev 860)
+++ trunk/ChangeLog	2006-10-02 15:22:29 UTC (rev 861)
@@ -6,6 +6,10 @@
    src/makefile.win32, src/Makefile.am, po/POTFILES.in:
    Move global tags code to symbols.c.
    Added symbols_global_tags_loaded(), symbols_get_global_keywords().
+ * src/callbacks.c, src/sci_cb.c, src/sciwrappers.c, src/sciwrappers.h,
+   src/document.c:
+   Change sci_get_line to return a NULL terminated string.
+   Fix memory leak and possible invalid read in sci_cb_auto_latex().
 
 
 2006-10-01  Enrico Tröger  <enrico.troeger at uvena.de>

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2006-10-02 11:31:54 UTC (rev 860)
+++ trunk/src/callbacks.c	2006-10-02 15:22:29 UTC (rev 861)
@@ -1296,8 +1296,7 @@
 				if (pos == -1) break;
 
 				line = sci_get_line_from_position(doc_list[i].sci, pos);
-				buffer = g_malloc0(sci_get_line_length(doc_list[i].sci, line) + 1);
-				sci_get_line(doc_list[i].sci, line, buffer);
+				buffer = sci_get_line(doc_list[i].sci, line);
 
 				if (doc_list[i].file_name == NULL)
 					short_file_name = g_strdup(GEANY_STRING_UNTITLED);

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2006-10-02 11:31:54 UTC (rev 860)
+++ trunk/src/document.c	2006-10-02 15:22:29 UTC (rev 861)
@@ -1335,13 +1335,10 @@
 		sci_get_line_length(doc_list[idx].sci, line) == utils_get_eol_char_len(idx))
 		return;
 
+	// don't set the indicator on whitespace
 	len = end - start;
-	linebuf = g_malloc(len);
+	linebuf = sci_get_line(doc_list[idx].sci, line);
 
-	// don't set the indicator on whitespace
-	sci_get_line(doc_list[idx].sci, line, linebuf);
-	if (linebuf == NULL) return;
-
 	while (isspace(linebuf[i])) i++;
 	while (isspace(linebuf[len-1])) len--;
 	g_free(linebuf);

Modified: trunk/src/sci_cb.c
===================================================================
--- trunk/src/sci_cb.c	2006-10-02 11:31:54 UTC (rev 860)
+++ trunk/src/sci_cb.c	2006-10-02 15:22:29 UTC (rev 861)
@@ -330,9 +330,7 @@
 
 	if (! use_this_line) prev_line--;
 	len = sci_get_line_length(sci, prev_line);
-	linebuf = g_malloc(len + 1);
-	sci_get_line(sci, prev_line, linebuf);
-	linebuf[len] = '\0';
+	linebuf = sci_get_line(sci, prev_line);
 
 	for (i = 0; i < len; i++)
 	{
@@ -438,8 +436,7 @@
 								utils_get_eol_char_len(document_find_by_sci(sci));
 
 	// check that the line is empty, to not kill text in the line
-	line_buf = g_malloc(line_len + 1);
-	sci_get_line(sci, line, line_buf);
+	line_buf = sci_get_line(sci, line);
 	line_buf[line_len - eol_char_len] = '\0';
 	while (x < (line_len - eol_char_len))
 	{
@@ -469,11 +466,10 @@
 	gint line_start = sci_get_position_from_line(sci, line);
 	gint startword = pos - line_start;
 	gint endword = pos - line_start;
-	gchar *chunk = g_malloc(sci_get_line_length(sci, line) + 1);
+	gchar *chunk;
 
 	word[0] = '\0';
-	sci_get_line(sci, line, chunk);
-	chunk[sci_get_line_length(sci, line)] = '\0';
+	chunk = sci_get_line(sci, line);
 
 	while (startword > 0 && strchr(GEANY_WORDCHARS, chunk[startword - 1]))
 		startword--;
@@ -664,8 +660,7 @@
 	else if (lexer == SCLEX_RUBY && style == SCE_MAKE_COMMENT) return FALSE;
 
 
-	linebuf = g_malloc(line_len + 1);
-	sci_get_line(sci, line, linebuf);
+	linebuf = sci_get_line(sci, line);
 
 	// find the start of the current word
 	while ((startword > 0) && (strchr(GEANY_WORDCHARS, linebuf[startword - 1])))
@@ -706,8 +701,7 @@
 		gint i, start;
 
 		// get the line
-		buf = g_malloc0(line_len + 1);
-		sci_get_line(sci, line, buf);
+		buf = sci_get_line(sci, line);
 
 		// get to the first non-blank char (some kind of ltrim())
 		start = 0;
@@ -722,7 +716,7 @@
 
 			// take also "\begingroup" (or whatever there can be) and append "\endgroup" and so on.
 			i = start + 6;
-			while (buf[i] != '{' && j < (sizeof(full_cmd) - 1))
+			while (i < line_len && buf[i] != '{' && j < (sizeof(full_cmd) - 1))
 			{	// copy all between "\begin" and "{" to full_cmd
 				full_cmd[j] = buf[i];
 				i++;
@@ -757,13 +751,11 @@
 			SSM(sci, SCI_INSERTTEXT, pos, (sptr_t) construct);
 			sci_goto_pos(sci, pos + 1, TRUE);
 			g_free(construct);
-			g_free(buf);
 			g_free(eol);
 		}
-		else
-		{	// later there could be some else ifs for other keywords
-			return;
-		}
+		// later there could be some else ifs for other keywords
+
+		g_free(buf);
 	}
 }
 
@@ -1107,9 +1099,7 @@
 	// check whether the line is empty and can be deleted
 	line = sci_get_line_from_position(doc_list[idx].sci, pos);
 	len = sci_get_line_length(doc_list[idx].sci, line);
-	linebuf = g_malloc(len + 1);
-	sci_get_line(doc_list[idx].sci, line, linebuf);
-	linebuf[len] = '\0';
+	linebuf = sci_get_line(doc_list[idx].sci, line);
 	x = 0;
 	while (linebuf[x] != '\0' && isspace(linebuf[x])) x++;
 	if (x == len) SSM(doc_list[idx].sci, SCI_LINEDELETE, 0, 0);
@@ -1122,9 +1112,7 @@
 	// check whether the line is empty and can be deleted
 	line = sci_get_line_from_position(doc_list[idx].sci, pos);
 	len = sci_get_line_length(doc_list[idx].sci, line);
-	linebuf = g_malloc(len + 1);
-	sci_get_line(doc_list[idx].sci, line, linebuf);
-	linebuf[len] = '\0';
+	linebuf = sci_get_line(doc_list[idx].sci, line);
 	x = 0;
 	while (linebuf[x] != '\0' && isspace(linebuf[x])) x++;
 	if (x == len) SSM(doc_list[idx].sci, SCI_LINEDELETE, 0, 0);

Modified: trunk/src/sciwrappers.c
===================================================================
--- trunk/src/sciwrappers.c	2006-10-02 11:31:54 UTC (rev 860)
+++ trunk/src/sciwrappers.c	2006-10-02 15:22:29 UTC (rev 861)
@@ -469,11 +469,18 @@
 }
 
 
-void sci_get_line(ScintillaObject* sci, gint line, gchar* text)
+// Returns: a NULL-terminated copy of the line text
+gchar *sci_get_line(ScintillaObject* sci, gint line_num)
 {
-	SSM(sci,SCI_GETLINE, line, (sptr_t) text);
+	gint len = sci_get_line_length(sci, line_num);
+	gchar *linebuf = g_malloc(len + 1);
+
+	SSM(sci, SCI_GETLINE, line_num, (sptr_t) linebuf);
+	linebuf[len] = '\0';
+	return linebuf;
 }
 
+
 // the last char will be null terminated
 void sci_get_text(ScintillaObject* sci, gint len, gchar* text)
 {

Modified: trunk/src/sciwrappers.h
===================================================================
--- trunk/src/sciwrappers.h	2006-10-02 11:31:54 UTC (rev 860)
+++ trunk/src/sciwrappers.h	2006-10-02 15:22:29 UTC (rev 861)
@@ -81,7 +81,7 @@
 void				sci_get_text				(ScintillaObject* sci,gint len,gchar* text);
 void				sci_get_selected_text		(ScintillaObject* sci, gchar* text);
 gint				sci_get_selected_text_length(ScintillaObject* sci);
-void				sci_get_line				(ScintillaObject* sci, gint line, gchar* text);
+gchar *				sci_get_line				(ScintillaObject* sci, gint line_num);
 gint 				sci_get_line_length			(ScintillaObject* sci, gint line);
 gint				sci_get_line_count			( ScintillaObject* sci );
 void 				sci_get_xy_from_position	(ScintillaObject* sci,gint pos, gint* x, gint* y);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list