When we call dir_iterator_begin() and the provided path is invalid, the call won't fail and return NULL. Instead, the call succeeds, and the first call dir_iterator_advance() fails. That's unexpected behavior from the perspective of a user of this API. The expected behavior would be to fail and return NULL from dir_iterator_begin() if the provided path is invalid. Successful call to dir_iterator_begin() suggests that the root path is valid. To deal with this, call activate_level() in dir_iterator_begin() which opens the provided root path and confirms it's a valid directory path. By doing this we can return NULL from dir_iterator_begin() in case the provided root path isn't valid, implementing the expected behavior. Signed-off-by: Plato Kiorpelidis <kioplato@xxxxxxxxx> --- dir-iterator.c | 13 ++++++++++--- t/t0066-dir-iterator.sh | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/dir-iterator.c b/dir-iterator.c index 3adcfbc966..c36f549a78 100644 --- a/dir-iterator.c +++ b/dir-iterator.c @@ -181,10 +181,12 @@ int dir_iterator_advance(struct dir_iterator *dir_iterator) if (activate_err == FAIL_NOT_ENOENT && PEDANTIC) { goto error_out; } else if (activate_err != OK) { - --iter->levels_nr; + /* + * We activate the root level at `dir_iterator_begin()`. + * Therefore, there isn't any case to run out of levels. + */ - if (iter->levels_nr == 0) /* Failed to open root directory */ - goto error_out; + --iter->levels_nr; return dir_iterator_advance(dir_iterator); } @@ -295,6 +297,11 @@ struct dir_iterator *dir_iterator_begin(const char *path, unsigned int flags) goto error_out; } + if (activate_level(iter) != OK) { + saved_errno = errno; + goto error_out; + } + return dir_iterator; error_out: diff --git a/t/t0066-dir-iterator.sh b/t/t0066-dir-iterator.sh index 04e51928bc..52b0217bde 100755 --- a/t/t0066-dir-iterator.sh +++ b/t/t0066-dir-iterator.sh @@ -289,7 +289,7 @@ test_expect_success POSIXPERM,SANITY 'setup -- dir w/o perms' ' ' test_expect_success POSIXPERM,SANITY 'iteration of root dir w/o perms' ' cat >expected-out <<-EOF && - dir_iterator_advance failure: EACCES + dir_iterator_begin failure: EACCES EOF chmod 0 dir12 && @@ -301,7 +301,7 @@ test_expect_success POSIXPERM,SANITY 'iteration of root dir w/o perms' ' ' test_expect_success POSIXPERM,SANITY 'pedantic iteration of root dir w/o perms' ' cat >expected-out <<-EOF && - dir_iterator_advance failure: EACCES + dir_iterator_begin failure: EACCES EOF chmod 0 dir12 && -- 2.36.1