Skip to content

Commit 17124c8

Browse files
committed
Fixed regexp compilation of patterns with escaped '[' characters.
This fixes #934 issue on Github.
1 parent c367f7e commit 17124c8

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

external/njs_regex.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text)
114114

115115
for (p = start; p < end; p++) {
116116
switch (*p) {
117+
case '\\':
118+
p += 1;
119+
120+
break;
121+
117122
case '[':
118123
if (p + 1 < end && p[1] == ']') {
119124
p += 1;
@@ -122,6 +127,11 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text)
122127
} else if (p + 2 < end && p[1] == '^' && p[2] == ']') {
123128
p += 2;
124129
anychars += 1;
130+
131+
} else {
132+
while (p < end && *p != ']') {
133+
p += 1;
134+
}
125135
}
126136

127137
break;
@@ -146,6 +156,15 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text)
146156
for (p = start; p < end; p++) {
147157

148158
switch (*p) {
159+
case '\\':
160+
*dst++ = *p;
161+
if (p + 1 < end) {
162+
p += 1;
163+
*dst++ = *p;
164+
}
165+
166+
continue;
167+
149168
case '[':
150169
if (p + 1 < end && p[1] == ']') {
151170
p += 1;
@@ -156,6 +175,14 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text)
156175
p += 2;
157176
dst = njs_cpymem(dst, "[\\s\\S]", 6);
158177
continue;
178+
179+
} else {
180+
*dst++ = *p;
181+
while (p < end && *p != ']') {
182+
*dst++ = *p++;
183+
}
184+
185+
continue;
159186
}
160187
}
161188

src/test/njs_unit_test.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11969,6 +11969,48 @@ static njs_unit_test_t njs_test[] =
1196911969
{ njs_str("/[]a/.test('a')"),
1197011970
njs_str("false") },
1197111971

11972+
{ njs_str("/[#[]/.test('[')"),
11973+
njs_str("true") },
11974+
11975+
{ njs_str("/[\\s[]/.test('[')"),
11976+
njs_str("true") },
11977+
11978+
{ njs_str("/[#[^]/.test('[')"),
11979+
njs_str("true") },
11980+
11981+
{ njs_str("/[#\\[]/.test('[')"),
11982+
njs_str("true") },
11983+
11984+
{ njs_str("/[\\[^]/.test('[')"),
11985+
njs_str("true") },
11986+
11987+
{ njs_str("/[^]abc]/.test('#abc]')"),
11988+
njs_str("true") },
11989+
11990+
{ njs_str("/[[^]abc]/.test('[abc]')"),
11991+
njs_str("true") },
11992+
11993+
{ njs_str("/[[^]abc]/.test('^abc]')"),
11994+
njs_str("true") },
11995+
11996+
{ njs_str("/[]/.test('[]')"),
11997+
njs_str("false") },
11998+
11999+
{ njs_str("/[[]/.test('[')"),
12000+
njs_str("true") },
12001+
12002+
{ njs_str("/\\[]/.test('[]')"),
12003+
njs_str("true") },
12004+
12005+
{ njs_str("/[]abc]/.test('abc]')"),
12006+
njs_str("false") },
12007+
12008+
{ njs_str("/abc]/.test('abc]')"),
12009+
njs_str("true") },
12010+
12011+
{ njs_str("/\\\\\\[]/.test('\\\\[]')"),
12012+
njs_str("true") },
12013+
1197212014
#ifdef NJS_HAVE_PCRE2
1197312015
{ njs_str("/[]*a/.test('a')"),
1197412016
njs_str("true") },

0 commit comments

Comments
 (0)