check min-len of absent pattern
authorK.Kosako <kosako@sofnec.co.jp>
Thu, 13 Jul 2017 01:51:32 +0000 (10:51 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Thu, 13 Jul 2017 01:51:32 +0000 (10:51 +0900)
src/regparse.c

index 116b96ce1e96cf4a03097e8893c080b3d839435a..e53e82f6f60817d02ad4aa1cad897f9ad2ebd46d 100644 (file)
@@ -1679,6 +1679,8 @@ make_absent_group_tree(Node** node, Node* absent_body,
                        Node* generator, ScanEnv* env)
 {
   int r;
+  int invalid_node;
+  OnigLen min_len;
   Node* top;
   Node* quant;
   Node* step_body;
@@ -1689,6 +1691,23 @@ make_absent_group_tree(Node** node, Node* absent_body,
   *node = NULL_NODE;
   save = repeat_body = quant = 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) {
+    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;
@@ -1711,15 +1730,19 @@ make_absent_group_tree(Node** node, Node* absent_body,
   ns[0] = save;
   ns[1] = quant;
   top = make_list(2, ns);
-  if (IS_NULL(top)) goto err2;
+  if (IS_NULL(top)) {
+    r = ONIGERR_MEMORY;
+    goto err2;
+  }
 
   *node = top;
   return ONIG_NORMAL;
 
+ err0:
+  onig_node_free(generator);
  err1:
   onig_node_free(absent_body);
   onig_node_free(step_body);
-
  err2:
   onig_node_free(save);
   onig_node_free(quant);