diff mbox series

[v2,11/15] dir-iterator: open root dir in dir_iterator_begin()

Message ID 20220509175159.2948802-12-kioplato@gmail.com (mailing list archive)
State New, archived
Headers show
Series iterate dirs before or after their contents | expand

Commit Message

Plato Kiorpelidis May 9, 2022, 5:51 p.m. UTC
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(-)
diff mbox series

Patch

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 &&