details: https://github.com/nginx/njs/commit/17124c81d84cfed13e47791893aa301681994db4 branches: master commit: 17124c81d84cfed13e47791893aa301681994db4 user: Dmitry Volyntsev <xei...@nginx.com> date: Mon, 30 Jun 2025 18:30:03 -0700 description: Fixed regexp compilation of patterns with escaped '[' characters.
This fixes #934 issue on Github. --- external/njs_regex.c | 27 +++++++++++++++++++++++++++ src/test/njs_unit_test.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/external/njs_regex.c b/external/njs_regex.c index a118666b..a0decefd 100644 --- a/external/njs_regex.c +++ b/external/njs_regex.c @@ -114,6 +114,11 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text) for (p = start; p < end; p++) { switch (*p) { + case '\\': + p += 1; + + break; + case '[': if (p + 1 < end && p[1] == ']') { p += 1; @@ -122,6 +127,11 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text) } else if (p + 2 < end && p[1] == '^' && p[2] == ']') { p += 2; anychars += 1; + + } else { + while (p < end && *p != ']') { + p += 1; + } } break; @@ -146,6 +156,15 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text) for (p = start; p < end; p++) { switch (*p) { + case '\\': + *dst++ = *p; + if (p + 1 < end) { + p += 1; + *dst++ = *p; + } + + continue; + case '[': if (p + 1 < end && p[1] == ']') { p += 1; @@ -156,6 +175,14 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text) p += 2; dst = njs_cpymem(dst, "[\\s\\S]", 6); continue; + + } else { + *dst++ = *p; + while (p < end && *p != ']') { + *dst++ = *p++; + } + + continue; } } diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 3d466b96..01ff08d4 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -11969,6 +11969,48 @@ static njs_unit_test_t njs_test[] = { njs_str("/[]a/.test('a')"), njs_str("false") }, + { njs_str("/[#[]/.test('[')"), + njs_str("true") }, + + { njs_str("/[\\s[]/.test('[')"), + njs_str("true") }, + + { njs_str("/[#[^]/.test('[')"), + njs_str("true") }, + + { njs_str("/[#\\[]/.test('[')"), + njs_str("true") }, + + { njs_str("/[\\[^]/.test('[')"), + njs_str("true") }, + + { njs_str("/[^]abc]/.test('#abc]')"), + njs_str("true") }, + + { njs_str("/[[^]abc]/.test('[abc]')"), + njs_str("true") }, + + { njs_str("/[[^]abc]/.test('^abc]')"), + njs_str("true") }, + + { njs_str("/[]/.test('[]')"), + njs_str("false") }, + + { njs_str("/[[]/.test('[')"), + njs_str("true") }, + + { njs_str("/\\[]/.test('[]')"), + njs_str("true") }, + + { njs_str("/[]abc]/.test('abc]')"), + njs_str("false") }, + + { njs_str("/abc]/.test('abc]')"), + njs_str("true") }, + + { njs_str("/\\\\\\[]/.test('\\\\[]')"), + njs_str("true") }, + #ifdef NJS_HAVE_PCRE2 { njs_str("/[]*a/.test('a')"), njs_str("true") }, _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel