From: K.Kosako Date: Tue, 18 Jul 2017 01:27:14 +0000 (+0900) Subject: inhibit NODE_CALL in generators X-Git-Tag: v6.5.0^2~60 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=13563cb90e1dad3a76e1e1ca4bbedd3d9199f0ec;p=onig inhibit NODE_CALL in generators --- diff --git a/src/regcomp.c b/src/regcomp.c index 0b27caa..65873f0 100644 --- a/src/regcomp.c +++ b/src/regcomp.c @@ -2938,11 +2938,14 @@ tree_min_len(Node* node, ScanEnv* env) } extern OnigLen -onig_get_tiny_min_len(Node* node, int* invalid_node) +onig_get_tiny_min_len(Node* node, unsigned int inhibit_types, int* invalid_node) { OnigLen len; OnigLen tmin; + if ((NODE_TYPE2BIT(NODE_TYPE(node)) & inhibit_types) != 0) + *invalid_node = 1; + len = 0; switch (NODE_TYPE(node)) { #ifdef USE_CALL @@ -2950,12 +2953,11 @@ onig_get_tiny_min_len(Node* node, int* invalid_node) /* fall */ #endif case NODE_BACKREF: - *invalid_node = 1; break; case NODE_LIST: do { - tmin = onig_get_tiny_min_len(NODE_CAR(node), invalid_node); + tmin = onig_get_tiny_min_len(NODE_CAR(node), inhibit_types, invalid_node); len = distance_add(len, tmin); } while (IS_NOT_NULL(node = NODE_CDR(node))); break; @@ -2966,7 +2968,7 @@ onig_get_tiny_min_len(Node* node, int* invalid_node) y = node; do { x = NODE_CAR(y); - tmin = onig_get_tiny_min_len(x, invalid_node); + tmin = onig_get_tiny_min_len(x, inhibit_types, invalid_node); if (y == node) len = tmin; else if (len > tmin) len = tmin; } while (IS_NOT_NULL(y = NODE_CDR(y))); @@ -2990,7 +2992,7 @@ onig_get_tiny_min_len(Node* node, int* invalid_node) QuantNode* qn = QUANT_(node); if (qn->lower > 0) { - len = onig_get_tiny_min_len(NODE_BODY(node), invalid_node); + len = onig_get_tiny_min_len(NODE_BODY(node), inhibit_types, invalid_node); len = distance_multiply(len, qn->lower); } } @@ -3003,18 +3005,18 @@ onig_get_tiny_min_len(Node* node, int* invalid_node) case ENCLOSURE_MEMORY: case ENCLOSURE_OPTION: case ENCLOSURE_STOP_BACKTRACK: - len = onig_get_tiny_min_len(NODE_BODY(node), invalid_node); + len = onig_get_tiny_min_len(NODE_BODY(node), inhibit_types, invalid_node); break; case ENCLOSURE_IF_ELSE: { int elen; - len = onig_get_tiny_min_len(NODE_BODY(node), invalid_node); + len = onig_get_tiny_min_len(NODE_BODY(node), inhibit_types, invalid_node); if (IS_NOT_NULL(en->te.Then)) len = distance_add(len, - onig_get_tiny_min_len(en->te.Then, invalid_node)); + onig_get_tiny_min_len(en->te.Then, inhibit_types, invalid_node)); if (IS_NOT_NULL(en->te.Else)) - elen = onig_get_tiny_min_len(en->te.Else, invalid_node); + elen = onig_get_tiny_min_len(en->te.Else, inhibit_types, invalid_node); else elen = 0; if (elen < len) len = elen; diff --git a/src/regparse.c b/src/regparse.c index 55a174f..e40f67e 100644 --- a/src/regparse.c +++ b/src/regparse.c @@ -1874,8 +1874,11 @@ make_absent_group_tree(Node** node, Node* absent_body, if (q->greedy == 0) goto err0; body = NODE_BODY(generator); invalid_node = 0; - min_len = onig_get_tiny_min_len(body, &invalid_node); - /* ignore invalid_node (backref and call) */ + min_len = onig_get_tiny_min_len(body, (BIT_NODE_CALL), &invalid_node); + if (invalid_node != 0) { + r = ONIGERR_INVALID_ABSENT_GROUP_GENERATOR_PATTERN; + goto err0; + } if (min_len == 0) goto err0; repeat = generator; @@ -1886,7 +1889,8 @@ make_absent_group_tree(Node** node, Node* absent_body, } invalid_node = 0; - min_len = onig_get_tiny_min_len(absent_body, &invalid_node); + min_len = onig_get_tiny_min_len(absent_body, (BIT_NODE_CALL | BIT_NODE_BACKREF), + &invalid_node); if (invalid_node != 0) { r = ONIGERR_INVALID_ABSENT_GROUP_PATTERN; goto err0; diff --git a/src/regparse.h b/src/regparse.h index cc27894..7e2af39 100644 --- a/src/regparse.h +++ b/src/regparse.h @@ -441,7 +441,7 @@ extern int onig_names_free P_((regex_t* reg)); extern int onig_parse_tree P_((Node** root, const UChar* pattern, const UChar* end, regex_t* reg, ScanEnv* env)); extern int onig_free_shared_cclass_table P_((void)); extern int onig_is_code_in_cc P_((OnigEncoding enc, OnigCodePoint code, CClassNode* cc)); -extern OnigLen onig_get_tiny_min_len(Node* node, int* invalid_node); +extern OnigLen onig_get_tiny_min_len(Node* node, unsigned int inhibit_node_types, int* invalid_node); #ifdef ONIG_DEBUG #ifdef USE_NAMED_GROUP