Roland Illig wrote:
Ian Zagorskih wrote:


mc-4.6.1-pre4a

Synopsis:

Looks like mc core dumps when it cannot find "context default" section in syntax file.


Thanks for the bug report. I can reproduce it, and I'm working on a solution.

And here it is. The code that was erroneous was ugly, and so looks my patch. It adds a field to the editor that notes how many rules have been defined and takes its actions based on this number.


It has just been a weird idea to start an array with index 1 in C ...

I suggest that we replace code that uses NULL-terminated arrays with code that has an extra length (or count, or whatever) field. That way we can easily put assert()s before array indexes to ensure they are valid.

Roland
? mcedit-segv.patch
Index: edit-widget.h
===================================================================
RCS file: /cvsroot/mc/mc/edit/edit-widget.h,v
retrieving revision 1.24
diff -u -p -r1.24 edit-widget.h
--- edit-widget.h       3 Dec 2004 17:09:27 -0000       1.24
+++ edit-widget.h       15 Apr 2005 21:33:35 -0000
@@ -93,6 +93,7 @@ struct WEdit {
     /* syntax higlighting */
     struct _syntax_marker *syntax_marker;
     struct context_rule **rules;
+    size_t rules_count;                /* number of rules that are defined */
     long last_get_rule;
     struct syntax_rule rule;
     char *syntax_type;         /* description of syntax highlighting type 
being used */
Index: syntax.c
===================================================================
RCS file: /cvsroot/mc/mc/edit/syntax.c,v
retrieving revision 1.73
diff -u -p -r1.73 syntax.c
--- syntax.c    22 Feb 2005 17:00:38 -0000      1.73
+++ syntax.c    15 Apr 2005 21:33:35 -0000
@@ -678,6 +678,7 @@ edit_read_syntax_rules (WEdit *edit, FIL
     strcpy (whole_right, 
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_01234567890");
 
     r = edit->rules = g_malloc (alloc_contexts * sizeof (struct context_rule 
*));
+    edit->rules_count = 0;
 
     if (!edit->defines)
        edit->defines = g_tree_new ((GCompareFunc) strcmp);
@@ -908,6 +909,7 @@ edit_read_syntax_rules (WEdit *edit, FIL
     if (num_contexts == -1) {
        return line;
     }
+    edit->rules_count = num_contexts;
 
     {
        char *first_chars, *p;
@@ -932,17 +934,18 @@ edit_read_syntax_rules (WEdit *edit, FIL
 
 void edit_free_syntax_rules (WEdit * edit)
 {
-    int i, j;
+    size_t i, j;
     if (!edit)
        return;
     if (edit->defines)
        destroy_defines (&edit->defines);
     if (!edit->rules)
        return;
-    edit_get_rule (edit, -1);
+    if (edit->rules_count > 0)
+       edit_get_rule (edit, -1);
     syntax_g_free (edit->syntax_type);
     edit->syntax_type = 0;
-    for (i = 0; edit->rules[i]; i++) {
+    for (i = 0; i < edit->rules_count; i++) {
        if (edit->rules[i]->keyword) {
            for (j = 0; edit->rules[i]->keyword[j]; j++) {
                syntax_g_free (edit->rules[i]->keyword[j]->keyword);
_______________________________________________
Mc-devel mailing list
http://mail.gnome.org/mailman/listinfo/mc-devel

Reply via email to