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

Reply via email to