Hi! Some minutes ago I committed patch below. This one fixes crush in built-in editor with syntax highlighting if Syntax file contain lines like
\s+ \n lightgray/13 red But this 4 line Syntax file and many others still crush mc. # syntax rules version 62 file .\*ChangeLog$ GNU\sDistribution\sChangeLog\sFile # context [\ \t]+ \n lightgray/13 # end of Syntax. (Hopeless attempt to highlight trailing whitespace(s)). It seems something corrupts stack in syntax.c. Unfortunately I have no time to hint this bug. I am going to Moscow for 2-3 weeks and will have limited access to Internet. Regards, Andrew. Index: mc/edit/ChangeLog diff -u mc/edit/ChangeLog:1.29 mc/edit/ChangeLog:1.30 --- mc/edit/ChangeLog:1.29 Tue Nov 27 07:38:30 2001 +++ mc/edit/ChangeLog Wed Nov 28 07:40:18 2001 @@ -1,3 +1,19 @@ +2001-11-28 Andrew V. Samoilov <[EMAIL PROTECTED]> + + * syntax.c (apply_rules_going_right): Fix crush for lines like + \s+ \n lightgray/13 red + in Syntax file. + (read_one_line): Use EOF instead of -1. + (get_args): Fix buffer overflow for l without trailing + whitespace(s). + (break_a): New macro. + (edit_read_syntax_rules): Use break_a to fix memory leaks. + (edit_load_syntax): Eliminate s and use message to prevent + buffer overflow. + + * editdraw.c (edit_render): Eliminate f. It's only written + but never read. + 2001-11-27 Andrew V. Samoilov <[EMAIL PROTECTED]> * editmenu.c (edit_wrap_cmd): Use g_free() on the result Index: mc/edit/syntax.c diff -u mc/edit/syntax.c:1.17 mc/edit/syntax.c:1.18 --- mc/edit/syntax.c:1.17 Tue Sep 11 17:44:52 2001 +++ mc/edit/syntax.c Wed Nov 28 07:40:18 2001 @@ -238,6 +238,7 @@ if (!_rule.keyword) { char *p; p = (r = edit->rules[_rule.context])->keyword_first_chars; + if (p) while (*(p = xx_strchr ((unsigned char *) p + 1, c))) { struct key_word *k; int count; @@ -402,7 +403,7 @@ #endif for (;;) { c = fgetc (f); - if (c == -1) { + if (c == EOF) { if (errno == EINTR) continue; r = 0; @@ -493,14 +494,15 @@ static void get_args (char *l, char **args, int *argc) { *argc = 0; - l--; for (;;) { - char *p; - for (p = l + 1; *p && whiteness (*p); p++); + char *p = l; + while (*p && whiteness (*p)) + p++; if (!*p) break; for (l = p + 1; *l && !whiteness (*l); l++); - *l = '\0'; + if (*l) + *l++ = '\0'; *args = strdup_convert (p); (*argc)++; args++; @@ -512,11 +514,11 @@ { while (*args) { syntax_free (*args); - *args = 0; args++; } } +#define break_a {result=line;break;} #define check_a {if(!*a){result=line;break;}} #define check_not_a {if(*a){result=line;break;}} @@ -653,8 +655,7 @@ check_a; if (num_contexts == -1) { if (strcmp (*a, "default")) { /* first context is the default */ - *a = 0; - check_a; + break_a; } a++; c = r[0] = syntax_malloc (sizeof (struct context_rule)); @@ -724,7 +725,7 @@ } else if (!strcmp (args[0], "keyword")) { struct key_word *k; if (num_words == -1) - *a = 0; + break_a; check_a; k = r[num_contexts - 1]->keyword[num_words] = syntax_malloc (sizeof (struct key_word)); if (!strcmp (*a, "whole")) { @@ -745,8 +746,7 @@ } check_a; if (!strcmp (*a, "whole")) { - *a = 0; - check_a; + break_a; } k->keyword = (char *) strdup (*a++); k->first = *k->keyword; @@ -768,8 +768,7 @@ } else if (!strcmp (args[0], "file")) { break; } else { /* anything else is an error */ - *a = 0; - check_a; + break_a; } free_args (args); syntax_free (l); @@ -998,10 +997,10 @@ return; } if (r) { - char s[80]; edit_free_syntax_rules (edit); - sprintf (s, _ (" Error in file %s on line %d "), error_file_name ? error_file_name : f, r); - edit_error_dialog (_ (" Load syntax file "), s); + 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); return; } _______________________________________________ Mc-devel mailing list [EMAIL PROTECTED] http://mail.gnome.org/mailman/listinfo/mc-devel