create: Make the directory scan more robust.
authorAndre Noll <maan@tuebingen.mpg.de>
Thu, 1 Sep 2016 15:13:50 +0000 (17:13 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Fri, 2 Sep 2016 11:58:28 +0000 (13:58 +0200)
The directory traversal of adu calls adu_opendir() of fd.c for every
subdirectory. If this call fails with EACCESS, a warning is printed
but the operation continues, ignoring the directory which could not
be accessed. Other errors are considered fatal, though, and adu aborts
in this case.

This patch continues to scan in this case. This is achieved by making
all errors from adu_opendir non-fatal. In the error case we print a
warning and ignore the directory, but no longer abort.

Thanks to Steffen Schmidt for pointing out this flaw.

create.c

index af5694c..a3373db 100644 (file)
--- a/create.c
+++ b/create.c
@@ -140,10 +140,9 @@ static int scan_dir(char *dirname, uint64_t *parent_dir_num)
        check_signals();
        DEBUG_LOG("----------------- %llu: %s\n", (long long unsigned)current_dir_num, dirname);
        ret = adu_opendir(dirname, &dir, &cwd_fd);
-       if (ret < 0) {
-               if (ret != -ERRNO_TO_ERROR(EACCES))
-                       return ret;
-               WARNING_LOG("permission denied for %s\n", dirname);
+       if (ret < 0) { /* Non-fatal, continue with next dir */
+               WARNING_LOG("skipping dir %s: %s\n", dirname,
+                       adu_strerror(-ret));
                return 1;
        }
        while ((entry = readdir(dir))) {