From caf8c6644254143476b4a50893f3de404219f869 Mon Sep 17 00:00:00 2001 From: "K.Kosako" <kosako@sofnec.co.jp> Date: Thu, 13 Jul 2017 15:27:55 +0900 Subject: [PATCH] fix make_absent_group_tree() to check generator node before absent node --- src/regparse.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/regparse.c b/src/regparse.c index 9e95c58..172caad 100644 --- a/src/regparse.c +++ b/src/regparse.c @@ -1694,23 +1694,6 @@ make_absent_group_tree(Node** node, Node* absent_body, *node = NULL_NODE; save = repeat_body = repeat = step_body = NULL_NODE; - invalid_node = 0; - min_len = onig_get_tiny_min_len(absent_body, &invalid_node); - if (invalid_node != 0) { - r = ONIGERR_PARSER_BUG; // invalid absent pattern - goto err0; - } - if (min_len == 0) { // (?~) ==> simple fail - Node* f; - r = node_new_fail(&f, env); - if (r != 0) goto err0; - - *node = f; - onig_node_free(absent_body); - onig_node_free(step_body); - return ONIG_NORMAL; - } - if (IS_NULL(generator)) { r = node_new_true_anychar(&step_body, env); if (r != 0) goto err1; @@ -1720,7 +1703,7 @@ make_absent_group_tree(Node** node, Node* absent_body, QuantNode* q; Node* body; - r = ONIGERR_PARSER_BUG; // invalid absent generator pattern + r = ONIGERR_INVALID_ABSENT_GROUP_GENERATOR_PATTERN; if (NODE_TYPE(generator) != NODE_QUANT) goto err0; q = QUANT_(generator); if (q->greedy == 0) goto err0; @@ -1734,6 +1717,23 @@ make_absent_group_tree(Node** node, Node* absent_body, step_body = body; } + invalid_node = 0; + min_len = onig_get_tiny_min_len(absent_body, &invalid_node); + if (invalid_node != 0) { + r = ONIGERR_INVALID_ABSENT_GROUP_PATTERN; + goto err0; + } + if (min_len == 0) { // (?~) ==> simple fail + Node* f; + r = node_new_fail(&f, env); + if (r != 0) goto err0; + + *node = f; + onig_node_free(absent_body); + onig_node_free(step_body); + return ONIG_NORMAL; + } + r = make_absent_group_repeated_body_tree(&repeat_body, absent_body, step_body, env); if (r != 0) goto err1; @@ -5225,7 +5225,7 @@ parse_enclosure(Node** np, OnigToken* tok, int term, UChar** src, UChar* end, Node* top = absent_body; if (NODE_TYPE(top) != NODE_ALT || IS_NULL(NODE_CDR(top))) { onig_node_free(top); - return ONIGERR_PARSER_BUG; + return ONIGERR_INVALID_ABSENT_GROUP_GENERATOR_PATTERN; } generator = NODE_CAR(top); @@ -5243,8 +5243,8 @@ parse_enclosure(Node** np, OnigToken* tok, int term, UChar** src, UChar* end, r = make_absent_group_tree(np, absent_body, generator, env); if (r != 0) { - onig_node_free(absent_body); - onig_node_free(generator); + //onig_node_free(absent_body); + //onig_node_free(generator); return r; } goto end; -- 2.40.0