diff --git a/match.c b/match.c index bcdca3e..c55c76c 100644 --- a/match.c +++ b/match.c @@ -26,14 +26,15 @@ extern bool match(char *p, char *m, char *s) { continue; } break; - case '[': { - int r = 1 + rangematch(p+1, *s); - if (r > 0) { - p += r, m += r, s++; - continue; + case '[': + if (*s) { + int r = 1 + rangematch(p+1, *s); + if (r > 0) { + p += r, m += r, s++; + continue; + } } break; - } case '*': next.p = p++; next.m = m++; @@ -42,7 +43,6 @@ extern bool match(char *p, char *m, char *s) { default: panic("bad metacharacter in match"); /* NOTREACHED */ - return FALSE; /* hush up gcc -Wall */ } } if (next.s != NULL) { diff --git a/trip.rc b/trip.rc index 130b96d..104504e 100644 --- a/trip.rc +++ b/trip.rc @@ -358,6 +358,10 @@ if (~ x [y]) fail rangematch out of range if (~ x x?) fail too many characters in pattern +if (~ . .[~.]) + fail matched nul terminator +if (~ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab a*a*a*a*a*a*a*a) + fail this should finish in linear time sh -c 'test -f /////$tmpdir//////a?c.'^$pid || fail glob with many slashes if (!~ /////$tmpdir//////a*.$pid /////$tmpdir//////a?c.$pid)