From 2328d8dbb5a8c774afb99d363b6e98cd25ee304d Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sun, 9 Jul 2017 16:35:38 -0400 Subject: Handle ENOTDIR the same as ENOENT For a/b/c, ENOTDIR is returned instead of ENOENT if a or b are not directories. Handle this uniformly when detecting broken symlinks, readdir races, etc. --- eval.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 90b854e..daee9d6 100644 --- a/eval.c +++ b/eval.c @@ -51,7 +51,7 @@ struct eval_state { */ static bool eval_should_ignore(const struct eval_state *state, int error) { return state->cmdline->ignore_races - && error == ENOENT + && (error == ENOENT || errno == ENOTDIR) && state->ftwbuf->depth > 0; } @@ -788,7 +788,7 @@ bool eval_xtype(const struct expr *expr, struct eval_state *state) { struct stat sb; if (fstatat(ftwbuf->at_fd, ftwbuf->at_path, &sb, at_flags) != 0) { - if (!follow && errno == ENOENT) { + if (!follow && (errno == ENOENT || errno == ENOTDIR)) { // Broken symlink return eval_type(expr, state); } else { -- cgit v1.2.3