Syntax file crash mc: probable fixed

Andrew V. Samoilov kai at cmail.ru
Wed Nov 28 15:44:47 UTC 2001


Hi, Pavel!

This patch fixes crushes in built-in editor 
with incorrect Syntax file(s).  Unfortunately I have not
time to test it hardly.  In worse scenario I will be 
offline for a 3 weeks, so commit it please if you find it right.
I am too harry now to make sure I break nothing.

Regards,
Andrew.

ChangeLog:

	* syntax.c (syntax_g_free): New macros. Use to release
	and NULLify glib allocated memory area(s).
	(strdup_convert): Rename to ...
	(convert): ... this.  Don't strdup passed string.
	(get_args): Use convert instead of strdup_convert.
	(free_args): Make it do notning macros.
	(open_include_file): Eliminate p array. Use glib
	functions to construct error_file_name. Use PATH_SEP_STR
	instead of "/".
	(edit_read_syntax_rules): Use syntax_g_free to release
	error_file_name.
	(edit_load_syntax): Likewise.

--- mc-cvs/edit/syntax.c	Wed Nov 28 17:15:06 2001
+++ mc/edit/syntax.c	Wed Nov 28 17:17:37 2001
@@ -68,6 +68,7 @@ static void *syntax_malloc (size_t x)
 }
 
 #define syntax_free(x) {if(x){free(x);(x)=0;}}
+#define syntax_g_free(x) {if(x){g_free(x);(x)=0;}}
 
 static long compare_word_to_right (WEdit * edit, long i, char *text, char *whole_left, char *whole_right, int line_start)
 {
@@ -428,10 +429,10 @@ static int read_one_line (char **line, F
     return r;
 }
 
-static char *strdup_convert (char *s)
+static char *convert (char *s)
 {
     char *r, *p;
-    p = r = (char *) strdup (s);
+    p = r = s;
     while (*s) {
 	switch (*s) {
 	case '\\':
@@ -503,13 +505,13 @@ static void get_args (char *l, char **ar
 	for (l = p + 1; *l && !whiteness (*l); l++);
 	if (*l)
 	    *l++ = '\0';
-	*args = strdup_convert (p);
+	*args = convert (p);
 	(*argc)++;
 	args++;
     }
     *args = 0;
 }
-
+#if 0
 static void free_args (char **args)
 {
     while (*args) {
@@ -517,6 +519,9 @@ static void free_args (char **args)
 	args++;
     }
 }
+#else
+#define free_args(x)
+#endif
 
 #define break_a	{result=line;break;}
 #define check_a {if(!*a){result=line;break;}}
@@ -557,25 +562,23 @@ extern char *mc_home;
 static FILE *open_include_file (char *filename)
 {
     FILE *f;
-    char p[MAX_PATH_LEN];
-    syntax_free (error_file_name);
-    error_file_name = (char *) strdup (filename);
+
+    syntax_g_free (error_file_name);
+    error_file_name = g_strdup (filename);
     if (*filename == '/')
 	return fopen (filename, "r");
-    strcpy (p, home_dir);
-    strcat (p, EDIT_DIR "/");
-    strcat (p, filename);
-    syntax_free (error_file_name);
-    error_file_name = (char *) strdup (p);
-    f = fopen (p, "r");
+
+    syntax_g_free (error_file_name);
+    error_file_name = g_strconcat (home_dir, EDIT_DIR PATH_SEP_STR,
+				   filename, NULL);
+    f = fopen (error_file_name, "r");
     if (f)
 	return f;
-    strcpy (p, mc_home);
-    strcat (p, "/syntax/");
-    strcat (p, filename);
-    syntax_free (error_file_name);
-    error_file_name = (char *) strdup (p);
-    return fopen (p, "r");
+
+    syntax_g_free (error_file_name);
+    error_file_name = g_strconcat (mc_home, PATH_SEP_STR "syntax" PATH_SEP_STR,
+				   filename, NULL);
+    return fopen (error_file_name, "r");
 }
 
 /* returns line number on error */
@@ -610,7 +613,7 @@ static int edit_read_syntax_rules (WEdit
 		f = g;
 		g = 0;
 		line = save_line + 1;
-		syntax_free (error_file_name);
+		syntax_g_free (error_file_name);
 		if (l)
 		    syntax_free (l);
 		if (!read_one_line (&l, f))
@@ -631,7 +634,7 @@ static int edit_read_syntax_rules (WEdit
 	    g = f;
 	    f = open_include_file (args[1]);
 	    if (!f) {
-		syntax_free (error_file_name);
+		syntax_g_free (error_file_name);
 		result = line;
 		break;
 	    }
@@ -1001,7 +1004,7 @@ void edit_load_syntax (WEdit * edit, cha
 	message (0, _(" Load syntax file "), 
 		    _(" Error in file %s on line %d "),
 		    error_file_name ? error_file_name : f, r);
-	syntax_free (error_file_name);
+	syntax_g_free (error_file_name);
 	return;
     }
 }



More information about the mc-devel mailing list