From 2cab36e882f72b3731910f857a73f734b19c5e14 Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 12 Nov 2026 13:43:48 +0200 Subject: [PATCH] Improve mg_match checks --- mongoose.c | 3 +-- src/str.c | 3 +-- test/unit_test.c | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/mongoose.c b/mongoose.c index c715f0a0..9250ff8b 100644 --- a/mongoose.c +++ b/mongoose.c @@ -17114,8 +17114,7 @@ bool mg_match(struct mg_str s, struct mg_str p, struct mg_str *caps) { if (caps && !caps->buf) caps->len = 0, caps->buf = &s.buf[j]; // Init cap ni = i++, nj = j + 1; } else if (nj > 0 && nj <= s.len && - ((ni < p.len && p.buf[ni] == '#') || - (j < s.len && s.buf[j] != '/'))) { + ((ni < p.len && p.buf[ni] == '#') || s.buf[nj - 1] != '/')) { i = ni, j = nj; if (caps && caps->buf == NULL && caps->len == 0) { caps--, caps->len = 0; // Restart previous cap diff --git a/src/str.c b/src/str.c index 7e6929e7..c5831d58 100644 --- a/src/str.c +++ b/src/str.c @@ -88,8 +88,7 @@ bool mg_match(struct mg_str s, struct mg_str p, struct mg_str *caps) { if (caps && !caps->buf) caps->len = 0, caps->buf = &s.buf[j]; // Init cap ni = i++, nj = j + 1; } else if (nj > 0 && nj <= s.len && - ((ni < p.len && p.buf[ni] == '#') || - (j < s.len && s.buf[j] != '/'))) { + ((ni < p.len && p.buf[ni] == '#') || s.buf[nj - 1] != '/')) { i = ni, j = nj; if (caps && caps->buf == NULL && caps->len == 0) { caps--, caps->len = 0; // Restart previous cap diff --git a/test/unit_test.c b/test/unit_test.c index 600a5435..46fb9635 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -72,6 +72,20 @@ static void test_match(void) { ASSERT(mg_match(mg_str_n("caabxa", 6), mg_str_n("#aa#bb#", 7), NULL) == 0); ASSERT(mg_match(mg_str_n("a__b_c", 6), mg_str_n("a*b*c", 5), NULL) == 1); + ASSERT(mg_match(mg_str("a/b/d/c"), mg_str("a/*/c"), NULL) == false); + ASSERT(mg_match(mg_str("a/b/c"), mg_str("a/*/c"), NULL) == true); + ASSERT(mg_match(mg_str("a/b/d/c"), mg_str("a/#/c"), NULL) == true); + { + struct mg_str caps[2]; + ASSERT(mg_match(mg_str("a/b/d/c"), mg_str("a/*/c"), caps) == false); + ASSERT(mg_match(mg_str("a/b/c"), mg_str("a/*/c"), caps) == true); + ASSERT(mg_strcmp(caps[0], mg_str("b")) == 0); + ASSERT(mg_strcmp(caps[1], mg_str("")) == 0); + ASSERT(mg_match(mg_str("a/b/d/c"), mg_str("a/#/c"), caps) == true); + ASSERT(mg_strcmp(caps[0], mg_str("b/d")) == 0); + ASSERT(mg_strcmp(caps[1], mg_str("")) == 0); + } + { char *ae_value = (char *) malloc(1); // Exact size for ASAN ae_value[0] = 'g';