From: K.Kosako Date: Wed, 11 Sep 2019 04:24:04 +0000 (+0900) Subject: add output of max parse depth for ONIG_DEBUG_PARSE X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f4565f57bad6f661df7f6d7d5a64b1d5600c48f6;p=onig add output of max parse depth for ONIG_DEBUG_PARSE --- diff --git a/src/regcomp.c b/src/regcomp.c index 92d9799..2c00e0e 100644 --- a/src/regcomp.c +++ b/src/regcomp.c @@ -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 diff --git a/src/regparse.c b/src/regparse.c index cdf4e06..e5b397e 100644 --- a/src/regparse.c +++ b/src/regparse.c @@ -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) { diff --git a/src/regparse.h b/src/regparse.h index d23848d..4dafe46 100644 --- a/src/regparse.h +++ b/src/regparse.h @@ -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;