aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorK.Kosako <kkosako0@gmail.com>2022-11-01 23:44:18 +0900
committerK.Kosako <kkosako0@gmail.com>2022-11-01 23:44:18 +0900
commit045585a8650d5fb89e12b95c4bcd7b17c0ed8ad7 (patch)
tree5b63097c0b61ed9d75f8219f9c7bc266c0d5471f
parentf0480e275d1c7e15383cd5123aef697c626ccbf2 (diff)
downloadoniguruma-045585a8650d5fb89e12b95c4bcd7b17c0ed8ad7.zip
oniguruma-045585a8650d5fb89e12b95c4bcd7b17c0ed8ad7.tar.gz
oniguruma-045585a8650d5fb89e12b95c4bcd7b17c0ed8ad7.tar.bz2
change data_pattern_size from pattern_size
-rw-r--r--harnesses/base.c83
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;