Discovery: Distinguish readdir and closedir errors
authorChristian Kamm <mail@ckamm.de>
Mon, 7 Oct 2019 12:58:31 +0000 (14:58 +0200)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:59:01 +0000 (10:59 +0100)
src/libsync/discoveryphase.cpp

index f4ca7eaa3f0d90019f9322b4eedcfcf11127d187..ca0322c5dc4261ceea766c075d6853c67d2f2d2b 100644 (file)
@@ -247,9 +247,13 @@ void DiscoverySingleLocalDirectoryJob::run() {
         emit finishedFatalError(errorString);
         return;
     }
-    errno = 0;
+
     QVector<LocalInfo> results;
-    while (auto dirent = csync_vio_local_readdir(dh, _vfs)) {
+    while (true) {
+        errno = 0;
+        auto dirent = csync_vio_local_readdir(dh, _vfs);
+        if (!dirent)
+            break;
         if (dirent->type == ItemTypeSkip)
             continue;
         LocalInfo i;
@@ -279,13 +283,21 @@ void DiscoverySingleLocalDirectoryJob::run() {
         i.type = dirent->type;
         results.push_back(i);
     }
-    csync_vio_local_closedir(dh);
     if (errno != 0) {
+        csync_vio_local_closedir(dh);
+
         // Note: Windows vio converts any error into EACCES
         qCWarning(lcDiscovery) << "readdir failed for file in " << localPath << " - errno: " << errno;
         emit finishedFatalError(tr("Error while reading directory %1").arg(localPath));
         return;
     }
+
+    errno = 0;
+    csync_vio_local_closedir(dh);
+    if (errno != 0) {
+        qCWarning(lcDiscovery) << "closedir failed for file in " << localPath << " - errno: " << errno;
+    }
+
     emit finished(results);
 }