diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-02-20 19:21:48 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-02-20 19:23:36 +0200 |
commit | 84009ba4cd4246be9def916554e0b98561244771 (patch) | |
tree | a65efb1c3e3611440a59b7d46e11d27d770ec867 /src/tree.c | |
parent | 24890618970bcc010d090c2dced95f0cce746ca4 (diff) | |
download | grecs-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.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -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; } |