diff options
-rw-r--r-- | httpd/patterns.c | 13 | ||||
-rw-r--r-- | regress/patterns/Makefile | 11 | ||||
-rw-r--r-- | regress/patterns/patterns-tester.lua | 2 | ||||
-rw-r--r-- | regress/patterns/test-patterns-lua.out | 128 |
4 files changed, 148 insertions, 6 deletions
diff --git a/httpd/patterns.c b/httpd/patterns.c index 62c8078..08c1e27 100644 --- a/httpd/patterns.c +++ b/httpd/patterns.c @@ -429,13 +429,12 @@ match(struct match_state *ms, const char *s, const char *p) if (ms->repetitioncounter-- == 0) { match_error(ms, "max repetition items"); s = NULL; /* fail */ - } else - /* accept empty? */ - if (*ep == '*' || *ep == '?' || *ep == '-') { - p = ep + 1; + } else if + (*ep == '*' || *ep == '?' || *ep == '-') { + p = ep + 1; /* return match(ms, s, ep + 1); */ - goto init; + goto init; } else { /* '+' or no suffix */ s = NULL; /* fail */ @@ -628,11 +627,13 @@ str_find_aux(struct match_state *ms, const char *pattern, const char *string, do { const char *res; ms->level = 0; - assert(ms->matchdepth == MAXCCALLS); if ((res = match(ms, s1, p)) != NULL) { sm->sm_so = 0; sm->sm_eo = ls; return push_captures(ms, s1, res, sm + 1, nsm - 1) + 1; + + } else if (ms->error != NULL) { + return 0; } } while (s1++ < ms->src_end && !anchor); diff --git a/regress/patterns/Makefile b/regress/patterns/Makefile index 024f96e..995b416 100644 --- a/regress/patterns/Makefile +++ b/regress/patterns/Makefile @@ -8,6 +8,11 @@ REGRESS_TARGETS= test-patterns CLEANFILES += patterns-tester +#LUA?= lua53 +.ifdef LUA +REGRESS_TARGETS+= test-patterns-lua +.endif + patterns-tester: patterns-tester.c patterns.c patterns.h ${CC} -o $@ ${CFLAGS} ${.CURDIR}/patterns-tester.c ${HTTPDSRC}/patterns.c -I${HTTPDSRC} @@ -17,4 +22,10 @@ test-patterns: patterns-tester test-patterns.out test-patterns.in ./patterns-tester "$${string}" "$${pattern}" 2>&1 || true; \ done | diff -I 'OpenBSD' -u ${.CURDIR}/test-patterns.out - +test-patterns-lua: patterns-tester.lua test-patterns-lua.out test-patterns.in + cat ${.CURDIR}/test-patterns.in | grep -v '^#' | \ + while IFS=' ' read string pattern comments ; do \ + ${LUA} ./patterns-tester.lua "$${string}" "$${pattern}" 2>&1 || true; \ + done | diff -I 'OpenBSD' -u ${.CURDIR}/test-patterns-lua.out - + .include <bsd.regress.mk> diff --git a/regress/patterns/patterns-tester.lua b/regress/patterns/patterns-tester.lua new file mode 100644 index 0000000..15df0a7 --- /dev/null +++ b/regress/patterns/patterns-tester.lua @@ -0,0 +1,2 @@ +print(string.format("string='%s'\npattern='%s'", arg[1], arg[2])); +print(string.match(arg[1], arg[2])); diff --git a/regress/patterns/test-patterns-lua.out b/regress/patterns/test-patterns-lua.out new file mode 100644 index 0000000..0cab468 --- /dev/null +++ b/regress/patterns/test-patterns-lua.out @@ -0,0 +1,128 @@ +# $OpenBSD$ +string='/page/51' +pattern='^/(%a+)/(%d+)$' +page 51 +string='/Apage/51' +pattern='/[^%d][%w%u][^%c]+()[%d]+' +9 +string='/^page/51' +pattern='/^(.a.e)/(.)' +page 5 +string='/page/page-51' +pattern='/(.*)/%1-(%d+)' +page 51 +string='/page/[51]' +pattern='/page/(%b[])' +[51] +string=':-]' +pattern=']+' +] +string=':-)' +pattern='[)]+' +) +string='/page/51' +pattern='$^' +nil +string='1234567890' +pattern='([2-5]-)' + +string='****' +pattern='^**$' +**** +string='xxxx' +pattern='^x*$' +xxxx +string='/page/51' +pattern='no-%d-match' +nil +string='/page/page-51' +pattern='/(.*)/%9-(%d+)' +lua53: ./patterns-tester.lua:2: invalid capture index %9 +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string=':-)' +pattern=')+' +lua53: ./patterns-tester.lua:2: invalid pattern capture +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='/page/51' +pattern='/page/51(' +lua53: ./patterns-tester.lua:2: unfinished capture +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='/page/51' +pattern='/page/51%' +lua53: ./patterns-tester.lua:2: malformed pattern (ends with '%') +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='/page/51' +pattern='/page/[51' +lua53: ./patterns-tester.lua:2: malformed pattern (missing ']') +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='/page/(51)' +pattern='/page/%b(' +lua53: ./patterns-tester.lua:2: malformed pattern (missing arguments to '%b') +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='/page/51' +pattern='()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()' +lua53: ./patterns-tester.lua:2: too many captures +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='/page/51' +pattern='/page/%f' +lua53: ./patterns-tester.lua:2: missing '[' after '%f' in pattern +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='/page/51' +pattern='/page%f/51' +lua53: ./patterns-tester.lua:2: missing '[' after '%f' in pattern +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='q*********************************' +pattern='*************************************q' +lua53: ./patterns-tester.lua:2: max repetition items +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='q+++++++++++++++++++++++++++++++++' +pattern='+++++++++++++++++++++++++++++++++++++q' +lua53: ./patterns-tester.lua:2: max repetition items +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='q---------------------------------' +pattern='-------------------------------------q' +lua53: ./patterns-tester.lua:2: max repetition items +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? +string='q?????????????????????????????????' +pattern='?????????????????????????????????????q' +lua53: ./patterns-tester.lua:2: max repetition items +stack traceback: + [C]: in function 'string.match' + ./patterns-tester.lua:2: in main chunk + [C]: in ? |