mirror of
https://github.com/rizonesoft/Notepad3.git
synced 2026-06-14 21:09:05 +08:00
Merge branch 'RC1' into Xperimental
This commit is contained in:
commit
b9490e3204
@ -30,6 +30,8 @@ Supported character encodings:
|
||||
Master branch
|
||||
-------------
|
||||
|
||||
* NEW API: retry limit in search functions
|
||||
* Limit on maximum nesting level of subexp call (16)
|
||||
* Fixed behavior of isolated options in Perl and Java syntaxes. /...(?i).../
|
||||
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
Oniguruma API Version 6.9.4 2019/09/30
|
||||
Oniguruma API Version 6.9.5 2020/02/13
|
||||
|
||||
#include <oniguruma.h>
|
||||
|
||||
@ -273,6 +273,20 @@ Oniguruma API Version 6.9.4 2019/09/30
|
||||
normal return: ONIG_NORMAL
|
||||
|
||||
|
||||
# int onig_set_retry_limit_in_search_of_match_param(OnigMatchParam* mp, unsigned long limit)
|
||||
|
||||
Set a retry limit count of a search process.
|
||||
0 means unlimited.
|
||||
|
||||
If the value of this limit is not 0 and is smaller than the current value of the retry limit in match of mp, the value of retry limit in match is set to this limit.
|
||||
|
||||
arguments
|
||||
1 mp: match-param pointer
|
||||
2 limit: number of limit
|
||||
|
||||
normal return: ONIG_NORMAL
|
||||
|
||||
|
||||
# int onig_set_progress_callout_of_match_param(OnigMatchParam* mp, OnigCalloutFunc f)
|
||||
|
||||
Set a function for callouts of contents in progress.
|
||||
@ -333,7 +347,7 @@ Oniguruma API Version 6.9.4 2019/09/30
|
||||
|
||||
arguments
|
||||
1-7: same as onig_search()
|
||||
8 mp: match parameter values (match_stack_limit, retry_limit_in_match)
|
||||
8 mp: match parameter values (match_stack_limit, retry_limit_in_match, retry_limit_in_search)
|
||||
|
||||
|
||||
# int onig_match(regex_t* reg, const UChar* str, const UChar* end, const UChar* at,
|
||||
@ -368,7 +382,7 @@ Oniguruma API Version 6.9.4 2019/09/30
|
||||
|
||||
arguments
|
||||
1-6: same as onig_match()
|
||||
7 mp: match parameter values (match_stack_limit, retry_limit_in_match)
|
||||
7 mp: match parameter values (match_stack_limit, retry_limit_in_match, retry_limit_in_search)
|
||||
|
||||
|
||||
# int onig_scan(regex_t* reg, const UChar* str, const UChar* end,
|
||||
@ -866,19 +880,38 @@ Oniguruma API Version 6.9.4 2019/09/30
|
||||
|
||||
# unsigned long onig_get_retry_limit_in_match(void)
|
||||
|
||||
Return the limit of retry counts in matching process.
|
||||
Return the limit of retry counts in a matching process.
|
||||
(default: 10000000)
|
||||
|
||||
normal return: limit value
|
||||
normal return: current limit value
|
||||
|
||||
|
||||
# int onig_set_retry_limit_in_match(unsigned long n)
|
||||
# unsigned long onig_get_retry_limit_in_search(void)
|
||||
|
||||
Return the limit of retry counts in a search process.
|
||||
0 means unlimited.
|
||||
(default: 0)
|
||||
|
||||
normal return: current limit value
|
||||
|
||||
|
||||
# int onig_set_retry_limit_in_match(unsigned long limit)
|
||||
|
||||
Set the limit of retry counts in matching process.
|
||||
|
||||
normal return: ONIG_NORMAL
|
||||
|
||||
|
||||
# int onig_set_retry_limit_in_search(unsigned long limit)
|
||||
|
||||
Set a retry limit count of a search process.
|
||||
0 means unlimited.
|
||||
|
||||
If the value of this limit is not 0 and is smaller than the current value of the retry limit in match, the value of retry limit in match is set to this limit.
|
||||
|
||||
normal return: ONIG_NORMAL
|
||||
|
||||
|
||||
# OnigCalloutFunc onig_get_progress_callout(void)
|
||||
|
||||
Get a function for callouts of contents in progress.
|
||||
|
||||
@ -576,6 +576,7 @@ ONIG_EXTERN OnigSyntaxType* OnigDefaultSyntax;
|
||||
#define ONIGERR_MATCH_STACK_LIMIT_OVER -15
|
||||
#define ONIGERR_PARSE_DEPTH_LIMIT_OVER -16
|
||||
#define ONIGERR_RETRY_LIMIT_IN_MATCH_OVER -17
|
||||
#define ONIGERR_RETRY_LIMIT_IN_SEARCH_OVER -18
|
||||
#define ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED -21
|
||||
#define ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR -22
|
||||
#define ONIGERR_FAIL_TO_INITIALIZE -23
|
||||
@ -924,6 +925,10 @@ unsigned long onig_get_retry_limit_in_match P_((void));
|
||||
ONIG_EXTERN
|
||||
int onig_set_retry_limit_in_match P_((unsigned long n));
|
||||
ONIG_EXTERN
|
||||
unsigned long onig_get_retry_limit_in_search P_((void));
|
||||
ONIG_EXTERN
|
||||
int onig_set_retry_limit_in_search P_((unsigned long n));
|
||||
ONIG_EXTERN
|
||||
unsigned int onig_get_parse_depth_limit P_((void));
|
||||
ONIG_EXTERN
|
||||
int onig_set_capture_num_limit P_((int num));
|
||||
@ -952,6 +957,8 @@ int onig_set_match_stack_limit_size_of_match_param P_((OnigMatchParam* param, un
|
||||
ONIG_EXTERN
|
||||
int onig_set_retry_limit_in_match_of_match_param P_((OnigMatchParam* param, unsigned long limit));
|
||||
ONIG_EXTERN
|
||||
int onig_set_retry_limit_in_search_of_match_param P_((OnigMatchParam* param, unsigned long limit));
|
||||
ONIG_EXTERN
|
||||
int onig_set_progress_callout_of_match_param P_((OnigMatchParam* param, OnigCalloutFunc f));
|
||||
ONIG_EXTERN
|
||||
int onig_set_retraction_callout_of_match_param P_((OnigMatchParam* param, OnigCalloutFunc f));
|
||||
|
||||
@ -408,12 +408,12 @@ onig_set_default_case_fold_flag(OnigCaseFoldType case_fold_flag)
|
||||
}
|
||||
|
||||
static int
|
||||
int_multiply_cmp(int x, int y, int v)
|
||||
len_multiply_cmp(OnigLen x, int y, OnigLen v)
|
||||
{
|
||||
if (x == 0 || y == 0) return -1;
|
||||
|
||||
if (x < INT_MAX / y) {
|
||||
int xy = x * y;
|
||||
if (x < INFINITE_LEN / y) {
|
||||
OnigLen xy = x * (OnigLen )y;
|
||||
if (xy > v) return 1;
|
||||
else {
|
||||
if (xy == v) return 0;
|
||||
@ -421,7 +421,7 @@ int_multiply_cmp(int x, int y, int v)
|
||||
}
|
||||
}
|
||||
else
|
||||
return 1;
|
||||
return v == INFINITE_LEN ? 0 : 1;
|
||||
}
|
||||
|
||||
extern int
|
||||
@ -429,7 +429,7 @@ onig_positive_int_multiply(int x, int y)
|
||||
{
|
||||
if (x == 0 || y == 0) return 0;
|
||||
|
||||
if (x < INT_MAX / y)
|
||||
if (x < ONIG_INT_MAX / y)
|
||||
return x * y;
|
||||
else
|
||||
return -1;
|
||||
@ -1394,7 +1394,7 @@ compile_length_quantifier_node(QuantNode* qn, regex_t* reg)
|
||||
/* anychar repeat */
|
||||
if (is_anychar_infinite_greedy(qn)) {
|
||||
if (qn->lower <= 1 ||
|
||||
int_multiply_cmp(tlen, qn->lower, QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0) {
|
||||
len_multiply_cmp((OnigLen )tlen, qn->lower, QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0) {
|
||||
if (IS_NOT_NULL(qn->next_head_exact))
|
||||
return OPSIZE_ANYCHAR_STAR_PEEK_NEXT + tlen * qn->lower;
|
||||
else
|
||||
@ -1408,7 +1408,7 @@ compile_length_quantifier_node(QuantNode* qn, regex_t* reg)
|
||||
|
||||
if (infinite &&
|
||||
(qn->lower <= 1 ||
|
||||
int_multiply_cmp(tlen, qn->lower, QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0)) {
|
||||
len_multiply_cmp(tlen, qn->lower, QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0)) {
|
||||
if (qn->lower == 1 && tlen > QUANTIFIER_EXPAND_LIMIT_SIZE) {
|
||||
len = OPSIZE_JUMP;
|
||||
}
|
||||
@ -1439,7 +1439,7 @@ compile_length_quantifier_node(QuantNode* qn, regex_t* reg)
|
||||
}
|
||||
else if (!infinite && qn->greedy &&
|
||||
(qn->upper == 1 ||
|
||||
int_multiply_cmp(tlen + OPSIZE_PUSH, qn->upper,
|
||||
len_multiply_cmp((OnigLen )tlen + OPSIZE_PUSH, qn->upper,
|
||||
QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0)) {
|
||||
len = tlen * qn->lower;
|
||||
len += (OPSIZE_PUSH + tlen) * (qn->upper - qn->lower);
|
||||
@ -1467,7 +1467,8 @@ compile_quantifier_node(QuantNode* qn, regex_t* reg, ScanEnv* env)
|
||||
|
||||
if (is_anychar_infinite_greedy(qn) &&
|
||||
(qn->lower <= 1 ||
|
||||
int_multiply_cmp(tlen, qn->lower, QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0)) {
|
||||
len_multiply_cmp((OnigLen )tlen, qn->lower,
|
||||
QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0)) {
|
||||
r = compile_tree_n_times(NODE_QUANT_BODY(qn), qn->lower, reg, env);
|
||||
if (r != 0) return r;
|
||||
if (IS_NOT_NULL(qn->next_head_exact)) {
|
||||
@ -1491,7 +1492,8 @@ compile_quantifier_node(QuantNode* qn, regex_t* reg, ScanEnv* env)
|
||||
|
||||
if (infinite &&
|
||||
(qn->lower <= 1 ||
|
||||
int_multiply_cmp(tlen, qn->lower, QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0)) {
|
||||
len_multiply_cmp((OnigLen )tlen, qn->lower,
|
||||
QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0)) {
|
||||
int addr;
|
||||
|
||||
if (qn->lower == 1 && tlen > QUANTIFIER_EXPAND_LIMIT_SIZE) {
|
||||
@ -1586,7 +1588,7 @@ compile_quantifier_node(QuantNode* qn, regex_t* reg, ScanEnv* env)
|
||||
}
|
||||
else if (! infinite && qn->greedy &&
|
||||
(qn->upper == 1 ||
|
||||
int_multiply_cmp(tlen + OPSIZE_PUSH, qn->upper,
|
||||
len_multiply_cmp((OnigLen )tlen + OPSIZE_PUSH, qn->upper,
|
||||
QUANTIFIER_EXPAND_LIMIT_SIZE) <= 0)) {
|
||||
int n = qn->upper - qn->lower;
|
||||
|
||||
@ -4826,11 +4828,13 @@ is_all_code_len_1_items(int n, OnigCaseFoldCodeItem items[])
|
||||
}
|
||||
|
||||
static int
|
||||
get_min_max_byte_len_case_fold_items(int n, OnigCaseFoldCodeItem items[], int* rmin, int* rmax)
|
||||
get_min_max_byte_len_case_fold_items(int n, OnigCaseFoldCodeItem items[],
|
||||
OnigLen* rmin, OnigLen* rmax)
|
||||
{
|
||||
int i, len, minlen, maxlen;
|
||||
int i;
|
||||
OnigLen len, minlen, maxlen;
|
||||
|
||||
minlen = INT_MAX;
|
||||
minlen = INFINITE_LEN;
|
||||
maxlen = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
OnigCaseFoldCodeItem* item = items + i;
|
||||
@ -4925,7 +4929,7 @@ unravel_cf_string_add(Node** rlist, Node** rsn, UChar* s, UChar* end,
|
||||
|
||||
static int
|
||||
unravel_cf_string_alt_or_cc_add(Node** rlist, int n,
|
||||
OnigCaseFoldCodeItem items[], int byte_len, OnigEncoding enc,
|
||||
OnigCaseFoldCodeItem items[], OnigEncoding enc,
|
||||
OnigCaseFoldType case_fold_flag, UChar* s, UChar* end)
|
||||
{
|
||||
int r, i;
|
||||
@ -4982,7 +4986,7 @@ unravel_cf_string_alt_or_cc_add(Node** rlist, int n,
|
||||
static int
|
||||
unravel_cf_look_behind_add(Node** rlist, Node** rsn,
|
||||
int n, OnigCaseFoldCodeItem items[], OnigEncoding enc,
|
||||
UChar* s, int one_len)
|
||||
UChar* s, OnigLen one_len)
|
||||
{
|
||||
int r, i, found;
|
||||
|
||||
@ -5028,7 +5032,8 @@ unravel_cf_look_behind_add(Node** rlist, Node** rsn,
|
||||
static int
|
||||
unravel_case_fold_string(Node* node, regex_t* reg, int state)
|
||||
{
|
||||
int r, n, one_len, min_len, max_len, in_look_behind;
|
||||
int r, n, in_look_behind;
|
||||
OnigLen min_len, max_len, one_len;
|
||||
UChar *start, *end, *p, *q;
|
||||
StrNode* snode;
|
||||
Node *sn, *list;
|
||||
@ -5056,7 +5061,7 @@ unravel_case_fold_string(Node* node, regex_t* reg, int state)
|
||||
goto err;
|
||||
}
|
||||
|
||||
one_len = enclen(enc, p);
|
||||
one_len = (OnigLen )enclen(enc, p);
|
||||
if (n == 0) {
|
||||
q = p + one_len;
|
||||
r = unravel_cf_string_add(&list, &sn, p, q, 0 /* flag */);
|
||||
@ -5082,7 +5087,7 @@ unravel_case_fold_string(Node* node, regex_t* reg, int state)
|
||||
}
|
||||
|
||||
q = p + max_len;
|
||||
r = unravel_cf_string_alt_or_cc_add(&list, n, items, max_len, enc,
|
||||
r = unravel_cf_string_alt_or_cc_add(&list, n, items, enc,
|
||||
reg->case_fold_flag, p, q);
|
||||
if (r != 0) goto err;
|
||||
sn = NULL_NODE;
|
||||
@ -7347,6 +7352,9 @@ onig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,
|
||||
#endif
|
||||
#ifdef USE_CALLOUT
|
||||
|| (IS_NOT_NULL(reg->extp) && reg->extp->callout_num != 0)
|
||||
#endif
|
||||
#ifdef USE_CALL
|
||||
|| scan_env.num_call > 0
|
||||
#endif
|
||||
)
|
||||
reg->stack_pop_level = STACK_POP_LEVEL_ALL;
|
||||
|
||||
@ -55,6 +55,8 @@ onig_error_code_to_format(int code)
|
||||
p = "parse depth limit over"; break;
|
||||
case ONIGERR_RETRY_LIMIT_IN_MATCH_OVER:
|
||||
p = "retry-limit-in-match over"; break;
|
||||
case ONIGERR_RETRY_LIMIT_IN_SEARCH_OVER:
|
||||
p = "retry-limit-in-search over"; break;
|
||||
case ONIGERR_TYPE_BUG:
|
||||
p = "undefined type (bug)"; break;
|
||||
case ONIGERR_PARSER_BUG:
|
||||
|
||||
@ -35,6 +35,10 @@
|
||||
|
||||
#include "regint.h"
|
||||
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4018 )
|
||||
|
||||
|
||||
#define IS_MBC_WORD_ASCII_MODE(enc,s,end,mode) \
|
||||
((mode) == 0 ? ONIGENC_IS_MBC_WORD(enc,s,end) : ONIGENC_IS_MBC_WORD_ASCII(enc,s,end))
|
||||
|
||||
@ -72,7 +76,10 @@ typedef struct {
|
||||
|
||||
struct OnigMatchParamStruct {
|
||||
unsigned int match_stack_limit;
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
unsigned long retry_limit_in_match;
|
||||
unsigned long retry_limit_in_search;
|
||||
#endif
|
||||
#ifdef USE_CALLOUT
|
||||
OnigCalloutFunc progress_callout_of_contents;
|
||||
OnigCalloutFunc retraction_callout_of_contents;
|
||||
@ -95,8 +102,27 @@ extern int
|
||||
onig_set_retry_limit_in_match_of_match_param(OnigMatchParam* param,
|
||||
unsigned long limit)
|
||||
{
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
param->retry_limit_in_match = limit;
|
||||
return ONIG_NORMAL;
|
||||
#else
|
||||
return ONIG_NO_SUPPORT_CONFIG;
|
||||
#endif
|
||||
}
|
||||
|
||||
extern int
|
||||
onig_set_retry_limit_in_search_of_match_param(OnigMatchParam* param,
|
||||
unsigned long limit)
|
||||
{
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
param->retry_limit_in_search = limit;
|
||||
if (limit != 0 && param->retry_limit_in_match > limit)
|
||||
param->retry_limit_in_match = limit;
|
||||
|
||||
return ONIG_NORMAL;
|
||||
#else
|
||||
return ONIG_NO_SUPPORT_CONFIG;
|
||||
#endif
|
||||
}
|
||||
|
||||
extern int
|
||||
@ -141,7 +167,11 @@ typedef struct {
|
||||
int ptr_num;
|
||||
const UChar* start; /* search start position (for \G: BEGIN_POSITION) */
|
||||
unsigned int match_stack_limit;
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
unsigned long retry_limit_in_match;
|
||||
unsigned long retry_limit_in_search;
|
||||
unsigned long retry_limit_in_search_counter;
|
||||
#endif
|
||||
OnigMatchParam* mp;
|
||||
#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
|
||||
int best_len; /* for ONIG_OPTION_FIND_LONGEST */
|
||||
@ -1026,8 +1056,8 @@ onig_region_copy(OnigRegion* to, OnigRegion* from)
|
||||
#endif
|
||||
#define STK_EMPTY_CHECK_END 0x5000 /* for recursive call */
|
||||
#define STK_MEM_END_MARK 0x8100
|
||||
#define STK_CALL_FRAME 0x0400
|
||||
#define STK_RETURN 0x0500
|
||||
#define STK_CALL_FRAME (0x0400 | STK_MASK_POP_HANDLED)
|
||||
#define STK_RETURN (0x0500 | STK_MASK_POP_HANDLED)
|
||||
#define STK_SAVE_VAL 0x0600
|
||||
#define STK_MARK 0x0704
|
||||
|
||||
@ -1147,6 +1177,21 @@ struct OnigCalloutArgsStruct {
|
||||
|
||||
#endif /* USE_REPEAT_AND_EMPTY_CHECK_LOCAL_VAR */
|
||||
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
#define RETRY_IN_MATCH_ARG_INIT(msa,mpv) \
|
||||
(msa).retry_limit_in_match = (mpv)->retry_limit_in_match;\
|
||||
(msa).retry_limit_in_search = (mpv)->retry_limit_in_search;\
|
||||
(msa).retry_limit_in_search_counter = 0;
|
||||
#else
|
||||
#define RETRY_IN_MATCH_ARG_INIT(msa,mpv)
|
||||
#endif
|
||||
|
||||
#ifdef USE_CALL
|
||||
#define POP_CALL else if (stk->type == STK_RETURN) {subexp_call_nest_counter++;} else if (stk->type == STK_CALL_FRAME) {subexp_call_nest_counter--;}
|
||||
#else
|
||||
#define POP_CALL
|
||||
#endif
|
||||
|
||||
#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
|
||||
#define MATCH_ARG_INIT(msa, reg, arg_option, arg_region, arg_start, mpv) do { \
|
||||
(msa).stack_p = (void* )0;\
|
||||
@ -1154,7 +1199,7 @@ struct OnigCalloutArgsStruct {
|
||||
(msa).region = (arg_region);\
|
||||
(msa).start = (arg_start);\
|
||||
(msa).match_stack_limit = (mpv)->match_stack_limit;\
|
||||
(msa).retry_limit_in_match = (mpv)->retry_limit_in_match;\
|
||||
RETRY_IN_MATCH_ARG_INIT(msa,mpv)\
|
||||
(msa).mp = mpv;\
|
||||
(msa).best_len = ONIG_MISMATCH;\
|
||||
(msa).ptr_num = PTR_NUM_SIZE(reg);\
|
||||
@ -1166,7 +1211,7 @@ struct OnigCalloutArgsStruct {
|
||||
(msa).region = (arg_region);\
|
||||
(msa).start = (arg_start);\
|
||||
(msa).match_stack_limit = (mpv)->match_stack_limit;\
|
||||
(msa).retry_limit_in_match = (mpv)->retry_limit_in_match;\
|
||||
RETRY_IN_MATCH_ARG_INIT(msa,mpv)\
|
||||
(msa).mp = mpv;\
|
||||
(msa).ptr_num = PTR_NUM_SIZE(reg);\
|
||||
} while(0)
|
||||
@ -1210,7 +1255,7 @@ struct OnigCalloutArgsStruct {
|
||||
|
||||
|
||||
#define STACK_SAVE do{\
|
||||
msa->stack_n = (int )(stk_end - stk_base);\
|
||||
msa->stack_n = (int )(stk_end - stk_base);\
|
||||
if (is_alloca != 0) {\
|
||||
size_t size = sizeof(StackIndex) * msa->ptr_num \
|
||||
+ sizeof(StackType) * msa->stack_n;\
|
||||
@ -1238,9 +1283,10 @@ onig_set_match_stack_limit_size(unsigned int size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef USE_RETRY_LIMIT_IN_MATCH
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
|
||||
static unsigned long RetryLimitInMatch = DEFAULT_RETRY_LIMIT_IN_MATCH;
|
||||
static unsigned long RetryLimitInMatch = DEFAULT_RETRY_LIMIT_IN_MATCH;
|
||||
static unsigned long RetryLimitInSearch = DEFAULT_RETRY_LIMIT_IN_SEARCH;
|
||||
|
||||
#define CHECK_RETRY_LIMIT_IN_MATCH do {\
|
||||
if (retry_in_match_counter++ > retry_limit_in_match) {\
|
||||
@ -1252,24 +1298,47 @@ static unsigned long RetryLimitInMatch = DEFAULT_RETRY_LIMIT_IN_MATCH;
|
||||
|
||||
#define CHECK_RETRY_LIMIT_IN_MATCH
|
||||
|
||||
#endif /* USE_RETRY_LIMIT_IN_MATCH */
|
||||
#endif /* USE_RETRY_LIMIT */
|
||||
|
||||
extern unsigned long
|
||||
onig_get_retry_limit_in_match(void)
|
||||
{
|
||||
#ifdef USE_RETRY_LIMIT_IN_MATCH
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
return RetryLimitInMatch;
|
||||
#else
|
||||
/* return ONIG_NO_SUPPORT_CONFIG; */
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
extern int
|
||||
onig_set_retry_limit_in_match(unsigned long size)
|
||||
onig_set_retry_limit_in_match(unsigned long n)
|
||||
{
|
||||
#ifdef USE_RETRY_LIMIT_IN_MATCH
|
||||
RetryLimitInMatch = size;
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
RetryLimitInMatch = n;
|
||||
return 0;
|
||||
#else
|
||||
return ONIG_NO_SUPPORT_CONFIG;
|
||||
#endif
|
||||
}
|
||||
|
||||
extern unsigned long
|
||||
onig_get_retry_limit_in_search(void)
|
||||
{
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
return RetryLimitInSearch;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
extern int
|
||||
onig_set_retry_limit_in_search(unsigned long n)
|
||||
{
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
RetryLimitInSearch = n;
|
||||
if (n != 0 && RetryLimitInMatch > n)
|
||||
RetryLimitInMatch = n;
|
||||
|
||||
return 0;
|
||||
#else
|
||||
return ONIG_NO_SUPPORT_CONFIG;
|
||||
@ -1318,8 +1387,9 @@ extern int
|
||||
onig_initialize_match_param(OnigMatchParam* mp)
|
||||
{
|
||||
mp->match_stack_limit = MatchStackLimit;
|
||||
#ifdef USE_RETRY_LIMIT_IN_MATCH
|
||||
mp->retry_limit_in_match = RetryLimitInMatch;
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
mp->retry_limit_in_match = RetryLimitInMatch;
|
||||
mp->retry_limit_in_search = RetryLimitInSearch;
|
||||
#endif
|
||||
|
||||
#ifdef USE_CALLOUT
|
||||
@ -1521,9 +1591,9 @@ onig_set_callout_data_by_callout_args_self(OnigCalloutArgs* args,
|
||||
|
||||
|
||||
static int
|
||||
stack_double(int is_alloca, char** arg_alloc_base,
|
||||
StackType** arg_stk_base, StackType** arg_stk_end, StackType** arg_stk,
|
||||
MatchArg* msa)
|
||||
stack_double(int* is_alloca, char** arg_alloc_base,
|
||||
StackType** arg_stk_base, StackType** arg_stk_end,
|
||||
StackType** arg_stk, MatchArg* msa)
|
||||
{
|
||||
unsigned int n;
|
||||
int used;
|
||||
@ -1542,18 +1612,21 @@ stack_double(int is_alloca, char** arg_alloc_base,
|
||||
size = sizeof(StackIndex) * msa->ptr_num + sizeof(StackType) * n;
|
||||
n *= 2;
|
||||
new_size = sizeof(StackIndex) * msa->ptr_num + sizeof(StackType) * n;
|
||||
if (is_alloca != 0) {
|
||||
if (*is_alloca != 0) {
|
||||
new_alloc_base = (char* )xmalloc(new_size);
|
||||
if (IS_NULL(new_alloc_base)) {
|
||||
STACK_SAVE;
|
||||
return ONIGERR_MEMORY;
|
||||
}
|
||||
xmemcpy(new_alloc_base, alloc_base, size);
|
||||
*is_alloca = 0;
|
||||
}
|
||||
else {
|
||||
if (msa->match_stack_limit != 0 && n > msa->match_stack_limit) {
|
||||
if ((unsigned int )(stk_end - stk_base) == msa->match_stack_limit)
|
||||
if ((unsigned int )(stk_end - stk_base) == msa->match_stack_limit) {
|
||||
STACK_SAVE;
|
||||
return ONIGERR_MATCH_STACK_LIMIT_OVER;
|
||||
}
|
||||
else
|
||||
n = msa->match_stack_limit;
|
||||
}
|
||||
@ -1576,9 +1649,8 @@ stack_double(int is_alloca, char** arg_alloc_base,
|
||||
|
||||
#define STACK_ENSURE(n) do {\
|
||||
if ((int )(stk_end - stk) < (n)) {\
|
||||
int r = stack_double(is_alloca, &alloc_base, &stk_base, &stk_end, &stk, msa);\
|
||||
if (r != 0) { STACK_SAVE; return r; } \
|
||||
is_alloca = 0;\
|
||||
int r = stack_double(&is_alloca, &alloc_base, &stk_base, &stk_end, &stk, msa);\
|
||||
if (r != 0) return r;\
|
||||
UPDATE_FOR_STACK_REALLOC;\
|
||||
}\
|
||||
} while(0)
|
||||
@ -1921,6 +1993,7 @@ stack_double(int is_alloca, char** arg_alloc_base,
|
||||
}\
|
||||
POP_REPEAT_INC \
|
||||
POP_EMPTY_CHECK_START \
|
||||
POP_CALL \
|
||||
POP_CALLOUT_CASE\
|
||||
}\
|
||||
}\
|
||||
@ -1947,6 +2020,7 @@ stack_double(int is_alloca, char** arg_alloc_base,
|
||||
}\
|
||||
POP_REPEAT_INC \
|
||||
POP_EMPTY_CHECK_START \
|
||||
POP_CALL \
|
||||
/* Don't call callout here because negation of total success by (?!..) (?<!..) */\
|
||||
}\
|
||||
}\
|
||||
@ -1971,6 +2045,7 @@ stack_double(int is_alloca, char** arg_alloc_base,
|
||||
}\
|
||||
POP_REPEAT_INC \
|
||||
POP_EMPTY_CHECK_START \
|
||||
POP_CALL \
|
||||
/* Don't call callout here because negation of total success by (?!..) (?<!..) */\
|
||||
}\
|
||||
}\
|
||||
@ -2716,7 +2791,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
|
||||
StackIndex *repeat_stk;
|
||||
StackIndex *empty_check_stk;
|
||||
#endif
|
||||
#ifdef USE_RETRY_LIMIT_IN_MATCH
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
unsigned long retry_limit_in_match;
|
||||
unsigned long retry_in_match_counter;
|
||||
#endif
|
||||
@ -2728,6 +2803,9 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
|
||||
OnigOptionType option = reg->options;
|
||||
OnigEncoding encode = reg->enc;
|
||||
OnigCaseFoldType case_fold_flag = reg->case_fold_flag;
|
||||
#ifdef USE_CALL
|
||||
unsigned long subexp_call_nest_counter = 0;
|
||||
#endif
|
||||
|
||||
#ifdef ONIG_DEBUG_MATCH
|
||||
static unsigned int counter = 1;
|
||||
@ -2749,7 +2827,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
|
||||
msa->mp->match_at_call_counter++;
|
||||
#endif
|
||||
|
||||
#ifdef USE_RETRY_LIMIT_IN_MATCH
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
retry_limit_in_match = msa->retry_limit_in_match;
|
||||
#endif
|
||||
|
||||
@ -2773,7 +2851,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
|
||||
STACK_PUSH_BOTTOM(STK_ALT, FinishCode); /* bottom stack */
|
||||
INIT_RIGHT_RANGE;
|
||||
|
||||
#ifdef USE_RETRY_LIMIT_IN_MATCH
|
||||
#ifdef USE_RETRY_LIMIT
|
||||
retry_in_match_counter = 0;
|
||||
#endif
|
||||
|
||||
@ -3794,8 +3872,6 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
|
||||
|
||||
CASE_OP(POP)
|
||||
STACK_POP_ONE;
|
||||
/* for stop backtrack */
|
||||
/* CHECK_RETRY_LIMIT_IN_MATCH; */
|
||||
INC_OP;
|
||||
JUMP_OUT;
|
||||
|
||||
@ -3900,14 +3976,19 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
|
||||
|
||||
#ifdef USE_CALL
|
||||
CASE_OP(CALL)
|
||||
if (subexp_call_nest_counter == SUBEXP_CALL_MAX_NEST_LEVEL)
|
||||
goto fail;
|
||||
subexp_call_nest_counter++;
|
||||
addr = p->call.addr;
|
||||
INC_OP; STACK_PUSH_CALL_FRAME(p);
|
||||
p = reg->ops + addr;
|
||||
|
||||
JUMP_OUT;
|
||||
|
||||
CASE_OP(RETURN)
|
||||
STACK_RETURN(p);
|
||||
STACK_PUSH_RETURN;
|
||||
subexp_call_nest_counter--;
|
||||
JUMP_OUT;
|
||||
#endif
|
||||
|
||||
@ -4138,6 +4219,15 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
|
||||
} BYTECODE_INTERPRETER_END;
|
||||
|
||||
match_at_end:
|
||||
if (msa->retry_limit_in_search != 0) {
|
||||
if (retry_in_match_counter > ULONG_MAX - msa->retry_limit_in_search_counter)
|
||||
best_len = ONIGERR_RETRY_LIMIT_IN_SEARCH_OVER;
|
||||
else {
|
||||
msa->retry_limit_in_search_counter += retry_in_match_counter;
|
||||
if (msa->retry_limit_in_search_counter > msa->retry_limit_in_search)
|
||||
best_len = ONIGERR_RETRY_LIMIT_IN_SEARCH_OVER;
|
||||
}
|
||||
}
|
||||
STACK_SAVE;
|
||||
return best_len;
|
||||
}
|
||||
@ -6389,6 +6479,8 @@ onig_setup_builtin_monitors_by_ascii_encoded_name(void* fp /* FILE* */)
|
||||
return ONIG_NORMAL;
|
||||
}
|
||||
|
||||
#pragma warning( pop )
|
||||
|
||||
#endif /* ONIG_NO_PRINT */
|
||||
|
||||
#endif /* USE_CALLOUT */
|
||||
|
||||
@ -64,7 +64,7 @@
|
||||
#define USE_STUBBORN_CHECK_CAPTURES_IN_EMPTY_REPEAT /* /(?:()|())*\2/ */
|
||||
#define USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE /* /\n$/ =~ "\n" */
|
||||
#define USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR
|
||||
#define USE_RETRY_LIMIT_IN_MATCH
|
||||
#define USE_RETRY_LIMIT
|
||||
#ifdef USE_GOTO_LABELS_AS_VALUES
|
||||
#define USE_THREADED_CODE
|
||||
#define USE_DIRECT_THREADED_CODE
|
||||
@ -86,7 +86,9 @@
|
||||
#define INIT_MATCH_STACK_SIZE 160
|
||||
#define DEFAULT_MATCH_STACK_LIMIT_SIZE 0 /* unlimited */
|
||||
#define DEFAULT_RETRY_LIMIT_IN_MATCH 10000000
|
||||
#define DEFAULT_RETRY_LIMIT_IN_SEARCH 0 /* unlimited */
|
||||
#define DEFAULT_PARSE_DEPTH_LIMIT 4096
|
||||
#define SUBEXP_CALL_MAX_NEST_LEVEL 16
|
||||
|
||||
|
||||
#include "regenc.h"
|
||||
@ -180,9 +182,14 @@
|
||||
#define CHECK_NULL_RETURN_MEMERR(p) if (IS_NULL(p)) return ONIGERR_MEMORY
|
||||
#define NULL_UCHARP ((UChar* )0)
|
||||
|
||||
#ifndef ONIG_INT_MAX
|
||||
#define ONIG_INT_MAX INT_MAX
|
||||
#endif
|
||||
|
||||
#define CHAR_MAP_SIZE 256
|
||||
#define INFINITE_LEN ONIG_INFINITE_DISTANCE
|
||||
#define LOOK_BEHIND_MAX_CHAR_LEN INT_MAX
|
||||
#define STEP_BACK_MAX_CHAR_LEN 65535 /* INT_MAX is too big */
|
||||
#define LOOK_BEHIND_MAX_CHAR_LEN STEP_BACK_MAX_CHAR_LEN
|
||||
|
||||
/* escape other system UChar definition */
|
||||
#ifdef ONIG_ESCAPE_UCHAR_COLLISION
|
||||
|
||||
@ -3456,7 +3456,7 @@ scan_number(UChar** src, const UChar* end, OnigEncoding enc)
|
||||
PFETCH(c);
|
||||
if (IS_CODE_DIGIT_ASCII(enc, c)) {
|
||||
val = (int )DIGITVAL(c);
|
||||
if ((INT_MAX - val) / 10 < num)
|
||||
if ((ONIG_INT_MAX - val) / 10 < num)
|
||||
return -1; /* overflow */
|
||||
|
||||
num = num * 10 + val;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user