]> granicus.if.org Git - onig/commitdiff
add output of max parse depth for ONIG_DEBUG_PARSE
authorK.Kosako <kosako@sofnec.co.jp>
Wed, 11 Sep 2019 04:24:04 +0000 (13:24 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Wed, 11 Sep 2019 04:24:04 +0000 (13:24 +0900)
src/regcomp.c
src/regparse.c
src/regparse.h

index 92d97992669c854c7b16ccdf81d414aa2269466e..2c00e0e14ef7858f3afd74113914874abce2db57 100644 (file)
@@ -6587,6 +6587,7 @@ onig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,
   }
 
 #ifdef ONIG_DEBUG_PARSE
+  fprintf(stderr, "MAX PARSE DEPTH: %d\n", scan_env.max_parse_depth);
   print_tree(stderr, root);
 #endif
 
index cdf4e0659c203fba9dccf7173dd5d9816b906a3c..e5b397e787dda2e142491d6196deaa462e3db62e 100644 (file)
@@ -199,6 +199,21 @@ onig_set_parse_depth_limit(unsigned int depth)
   return 0;
 }
 
+#ifdef ONIG_DEBUG_PARSE
+#define INC_PARSE_DEPTH(d) do {\
+  (d)++;\
+  if (env->max_parse_depth < (d)) env->max_parse_depth = d;\
+  if ((d) > ParseDepthLimit) \
+    return ONIGERR_PARSE_DEPTH_LIMIT_OVER;\
+} while (0)
+#else
+#define INC_PARSE_DEPTH(d) do {\
+  (d)++;\
+  if ((d) > ParseDepthLimit) \
+    return ONIGERR_PARSE_DEPTH_LIMIT_OVER;\
+} while (0)
+#endif
+
 static int
 bbuf_init(BBuf* buf, int size)
 {
@@ -1965,6 +1980,9 @@ scan_env_clear(ScanEnv* env)
   xmemset(env->mem_env_static, 0, sizeof(env->mem_env_static));
 
   env->parse_depth         = 0;
+#ifdef ONIG_DEBUG_PARSE
+  env->max_parse_depth     = 0;
+#endif
   env->backref_num         = 0;
   env->keep_num            = 0;
   env->save_num            = 0;
@@ -6244,9 +6262,7 @@ parse_char_class(Node** np, PToken* tok, UChar** src, UChar* end, ScanEnv* env)
 
   *np = NULL_NODE;
   val_type = -1;
-  env->parse_depth++;
-  if (env->parse_depth > ParseDepthLimit)
-    return ONIGERR_PARSE_DEPTH_LIMIT_OVER;
+  INC_PARSE_DEPTH(env->parse_depth);
 
   prev_cc = (CClassNode* )NULL;
   r = fetch_token_in_cc(tok, src, end, env);
@@ -8169,9 +8185,7 @@ parse_exp(Node** np, PToken* tok, int term, UChar** src, UChar* end,
       if (is_invalid_quantifier_target(*tp))
         return ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID;
 
-      parse_depth++;
-      if (parse_depth > ParseDepthLimit)
-        return ONIGERR_PARSE_DEPTH_LIMIT_OVER;
+      INC_PARSE_DEPTH(parse_depth);
 
       qn = node_new_quantifier(tok->u.repeat.lower, tok->u.repeat.upper,
                                r == TK_INTERVAL);
@@ -8287,9 +8301,7 @@ parse_subexp(Node** top, PToken* tok, int term, UChar** src, UChar* end,
   Node *node, **headp;
 
   *top = NULL;
-  env->parse_depth++;
-  if (env->parse_depth > ParseDepthLimit)
-    return ONIGERR_PARSE_DEPTH_LIMIT_OVER;
+  INC_PARSE_DEPTH(env->parse_depth);
 
   r = parse_branch(&node, tok, term, src, end, env, group_head);
   if (r < 0) {
index d23848db116cbeb3ab009949c563a6d121c9ec62..4dafe46f76dc3becae2d9336b55b46be74af1812 100644 (file)
@@ -417,6 +417,9 @@ typedef struct {
   MemEnv           mem_env_static[SCANENV_MEMENV_SIZE];
   MemEnv*          mem_env_dynamic;
   unsigned int     parse_depth;
+#ifdef ONIG_DEBUG_PARSE
+  unsigned int     max_parse_depth;
+#endif
   int backref_num;
   int keep_num;
   int save_num;