From 964b93a09deb7e166041c584ace83b2989f41671 Mon Sep 17 00:00:00 2001 From: Jonathan Marler Date: Sat, 6 Mar 2021 07:19:02 -0700 Subject: [PATCH] fix mishandling of ^ inside an expression --- Makefile | 1 + re.c | 1 + tests/test1.c | 20 ++++++++++++++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 857d2ee..05fe7ec 100644 --- a/Makefile +++ b/Makefile @@ -101,6 +101,7 @@ test: all @$(PYTHON) ./scripts/regex_test_neg.py [012345-9] $(NRAND_TESTS) @$(PYTHON) ./scripts/regex_test_neg.py [0-56789] $(NRAND_TESTS) @$(PYTHON) ./scripts/regex_test_neg.py .*123faerdig $(NRAND_TESTS) + @$(PYTHON) ./scripts/regex_test_neg.py a^ $(NRAND_TESTS) @echo @echo @./tests/test2 diff --git a/re.c b/re.c index 20d1474..34831af 100644 --- a/re.c +++ b/re.c @@ -393,6 +393,7 @@ static int matchone(regex_t p, char c) case NOT_ALPHA: return !matchalphanum(c); case WHITESPACE: return matchwhitespace(c); case NOT_WHITESPACE: return !matchwhitespace(c); + case BEGIN: return 0; default: return (p.u.ch == c); } } diff --git a/tests/test1.c b/tests/test1.c index 5fdfe74..666d18b 100644 --- a/tests/test1.c +++ b/tests/test1.c @@ -101,11 +101,12 @@ int main() int should_fail; int length; int correctlen; - size_t ntests = sizeof(test_vector) / sizeof(*test_vector); + size_t nvector_tests = sizeof(test_vector) / sizeof(*test_vector); + size_t ntests = nvector_tests + 1; size_t nfailed = 0; size_t i; - for (i = 0; i < ntests; ++i) + for (i = 0; i < nvector_tests; ++i) { pattern = test_vector[i][1]; text = test_vector[i][2]; @@ -141,6 +142,21 @@ int main() } } + // regression test for unhandled BEGIN in the middle of an expression + // we need to test text strings with all possible values for the second + // byte because re.c was matching it against an uninitalized value, so + // it could be anything + pattern = "a^"; + for (i = 0; i < 255; i++) { + char text_buf[] = { 'a', i, '\0' }; + int m = re_match(pattern, text_buf, &length); + if (m != -1) { + fprintf(stderr, "[%lu/%lu]: pattern '%s' matched '%s' unexpectedly", ntests, ntests, pattern, text_buf); + nfailed += 1; + break; + } + } + // printf("\n"); printf("%lu/%lu tests succeeded.\n", ntests - nfailed, ntests); printf("\n");