diff options
author | K.Kosako <kkosako0@gmail.com> | 2022-11-01 23:44:18 +0900 |
---|---|---|
committer | K.Kosako <kkosako0@gmail.com> | 2022-11-01 23:44:18 +0900 |
commit | 045585a8650d5fb89e12b95c4bcd7b17c0ed8ad7 (patch) | |
tree | 5b63097c0b61ed9d75f8219f9c7bc266c0d5471f | |
parent | f0480e275d1c7e15383cd5123aef697c626ccbf2 (diff) | |
download | oniguruma-045585a8650d5fb89e12b95c4bcd7b17c0ed8ad7.zip oniguruma-045585a8650d5fb89e12b95c4bcd7b17c0ed8ad7.tar.gz oniguruma-045585a8650d5fb89e12b95c4bcd7b17c0ed8ad7.tar.bz2 |
change data_pattern_size from pattern_size
-rw-r--r-- | harnesses/base.c | 83 |
1 files changed, 52 insertions, 31 deletions
diff --git a/harnesses/base.c b/harnesses/base.c index b8e1150..949c0e0 100644 --- a/harnesses/base.c +++ b/harnesses/base.c @@ -20,7 +20,7 @@ #define MATCH_STACK_LIMIT 10000000 #define MAX_REM_SIZE 1048576 #define MAX_SLOW_REM_SIZE 1024 -#define MAX_SLOW_REM_SIZE2 100 +#define MAX_SLOW_REM_SIZE2 80 #define SLOW_RETRY_LIMIT 2000 #define SLOW_SUBEXP_CALL_LIMIT 100 #define MAX_SLOW_BACKWARD_REM_SIZE 200 @@ -375,6 +375,28 @@ exec(OnigEncoding enc, OnigOptionType options, OnigSyntaxType* syntax, return 0; } +static size_t +fix_size(size_t x, OnigEncoding enc, int sl, int backward) +{ + if (x > MAX_REM_SIZE) x = MAX_REM_SIZE; + + if (sl > 0) { + if (sl >= 256) { // 256: exists heavy element + if (x > MAX_SLOW_REM_SIZE2) x = MAX_SLOW_REM_SIZE2; + } + else { + if (x > MAX_SLOW_REM_SIZE) x = MAX_SLOW_REM_SIZE; + } + } + if (backward != 0 && enc == ONIG_ENCODING_GB18030) { + if (x > MAX_SLOW_BACKWARD_REM_SIZE) + x = MAX_SLOW_BACKWARD_REM_SIZE; + } + + ADJUST_LEN(enc, x); + return x; +} + static int alloc_exec(OnigEncoding enc, OnigOptionType options, OnigSyntaxType* syntax, int backward, int pattern_size, size_t rem_size, unsigned char *data) @@ -383,49 +405,48 @@ alloc_exec(OnigEncoding enc, OnigOptionType options, OnigSyntaxType* syntax, int r; int sl; + int data_pattern_size; unsigned char *pattern; unsigned char *pattern_end; unsigned char *data_pattern; unsigned char *data_pattern_end; unsigned char *str_null_end; - pattern = (unsigned char *)malloc(pattern_size != 0 ? pattern_size : 1); - memcpy(pattern, data, pattern_size); - pattern_end = pattern + pattern_size; - data_pattern = pattern; - data_pattern_end = pattern_end; - #ifdef TEST_PATTERN pattern = (unsigned char *)malloc(sizeof(TestPattern)); memcpy(pattern, TestPattern, sizeof(TestPattern)); pattern_end = pattern + sizeof(TestPattern); +#else + pattern = (unsigned char *)malloc(pattern_size != 0 ? pattern_size : 1); + pattern_end = pattern + pattern_size; + memcpy(pattern, data, pattern_size); #endif - data += pattern_size; - rem_size -= pattern_size; - - if (rem_size > MAX_REM_SIZE) rem_size = MAX_REM_SIZE; - sl = onig_detect_can_be_slow_pattern(pattern, pattern_end, options, enc, syntax); #ifdef STANDALONE fprintf(stdout, "sl: %d\n", sl); #endif - if (sl > 0) { - if (sl >= 256) { // 256: exists heavy element - if (rem_size > MAX_SLOW_REM_SIZE2) - rem_size = MAX_SLOW_REM_SIZE2; - } - else { - if (rem_size > MAX_SLOW_REM_SIZE) - rem_size = MAX_SLOW_REM_SIZE; - } + + data_pattern_size = fix_size(pattern_size, enc, sl, backward); + + if ( +#ifdef TEST_PATTERN + 1 || +#endif + data_pattern_size != pattern_size) { + data_pattern = (unsigned char *)malloc(data_pattern_size != 0 + ? data_pattern_size : 1); + data_pattern_end = data_pattern + data_pattern_size; + memcpy(data_pattern, data, data_pattern_size); } - if (backward != 0 && enc == ONIG_ENCODING_GB18030) { - if (rem_size > MAX_SLOW_BACKWARD_REM_SIZE) - rem_size = MAX_SLOW_BACKWARD_REM_SIZE; + else { + data_pattern = pattern; + data_pattern_end = pattern_end; } - ADJUST_LEN(enc, rem_size); + data += pattern_size; + rem_size -= pattern_size; + rem_size = fix_size(rem_size, enc, sl, backward); #ifdef STANDALONE fprintf(stdout, "rem_size: %ld\n", rem_size); #endif @@ -435,13 +456,13 @@ alloc_exec(OnigEncoding enc, OnigOptionType options, OnigSyntaxType* syntax, str_null_end = str + rem_size; r = exec(enc, options, syntax, - (char *)pattern, (char *)pattern_end, - (char *)data_pattern, (char *)data_pattern_end, - (char *)str, str_null_end, backward, sl); + (char* )pattern, (char* )pattern_end, + (char* )data_pattern, (char* )data_pattern_end, + (char* )str, str_null_end, backward, sl); + + if (data_pattern != pattern) + free(data_pattern); -#ifdef TEST_PATTERN - free(data_pattern); -#endif free(pattern); free(str); return r; |