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