From 4cd28ed2aa3f098a1d35dd44ecec27002fadb89b Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sat, 13 Feb 2016 15:57:41 -0500 Subject: Fix -name handling when the root has trailing slashes. --- eval.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 5c78d0b..cd9b2e5 100644 --- a/eval.c +++ b/eval.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -311,7 +312,30 @@ bool eval_links(const struct expr *expr, struct eval_state *state) { */ bool eval_name(const struct expr *expr, struct eval_state *state) { struct BFTW *ftwbuf = state->ftwbuf; - return fnmatch(expr->sdata, ftwbuf->path + ftwbuf->nameoff, 0) == 0; + + const char *name = ftwbuf->path + ftwbuf->nameoff; + char *copy = NULL; + if (ftwbuf->depth == 0) { + // Any trailing slashes are not part of the name. This can only + // happen for the root path. + const char *slash = strchr(name, '/'); + if (slash == name) { + // The name of "/" (or "//", etc.) is "/" + name = "/"; + } else if (slash) { + copy = strdup(name); + if (!copy) { + eval_error(state); + return false; + } + copy[slash - name] = '\0'; + name = copy; + } + } + + bool ret = fnmatch(expr->sdata, name, 0) == 0; + free(copy); + return ret; } /** -- cgit v1.2.3