aboutsummaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2012-02-20 19:21:48 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2012-02-20 19:23:36 +0200
commit84009ba4cd4246be9def916554e0b98561244771 (patch)
treea65efb1c3e3611440a59b7d46e11d27d770ec867 /src/tree.c
parent24890618970bcc010d090c2dced95f0cce746ca4 (diff)
downloadgrecs-84009ba4cd4246be9def916554e0b98561244771.tar.gz
grecs-84009ba4cd4246be9def916554e0b98561244771.tar.bz2
Bugfix
* src/tree.c (node_reduce): Return 1 if the node has been freed. (reduceproc): Avoid descending into freed nodes.
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/tree.c b/src/tree.c
index 0eabc21..eb8b131 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -1029,7 +1029,7 @@ node_merge_block(struct grecs_node *to_node, struct grecs_node *from_node,
from_node->down = NULL;
}
-static void
+static int
node_reduce(struct grecs_node *node, struct grecs_keyword *kwp, int flags)
{
struct grecs_node *p;
@@ -1050,7 +1050,9 @@ node_reduce(struct grecs_node *node, struct grecs_keyword *kwp, int flags)
}
grecs_node_unlink(node);
grecs_node_free(node);
+ return 1;
}
+ return 0;
}
static enum grecs_tree_recurse_res
@@ -1074,13 +1076,15 @@ reduceproc(enum grecs_tree_recurse_op op, struct grecs_node *node, void *data)
}
if (kwp->flags & GRECS_INAC)
return grecs_tree_recurse_skip;
+ if (!(kwp->flags & GRECS_MULT) &&
+ node_reduce(node, kwp, clos->flags))
+ return grecs_tree_recurse_skip;
if (op == grecs_tree_recurse_pre) {
grecs_list_push(clos->sections, clos->cursect);
clos->cursect = kwp;
}
- }
- if (!(kwp && (kwp->flags & GRECS_MULT)))
- node_reduce(node, kwp, clos->flags);
+ } else if (node_reduce(node, kwp, clos->flags))
+ return grecs_tree_recurse_skip;
}
return grecs_tree_recurse_ok;
}

Return to:

Send suggestions and report system problems to the System administrator.