]> granicus.if.org Git - onig/commitdiff
inhibit NODE_CALL in generators
authorK.Kosako <kosako@sofnec.co.jp>
Tue, 18 Jul 2017 01:27:14 +0000 (10:27 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Tue, 18 Jul 2017 01:27:14 +0000 (10:27 +0900)
src/regcomp.c
src/regparse.c
src/regparse.h

index 0b27caa9bf88fd28a5b1b2f2e627fa1f403dcec1..65873f037ae7976ad7503dbdbd10dc529684d483 100644 (file)
@@ -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;
index 55a174fc4e3d5c48bb4ef2bc3ae8ecef9f176631..e40f67eb1ea33db0a403d7eec42cbbf410125839 100644 (file)
@@ -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;
index cc27894b41e7e6fb536d90bc516e0ae5a8b0149c..7e2af39046fe85bb80f9e7157a675c39621a49f5 100644 (file)
@@ -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