@@ -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:
@@ -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 &&
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@gmail.com> --- dir-iterator.c | 13 ++++++++++--- t/t0066-dir-iterator.sh | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-)