ensure detection of entry type on windows is reliable
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Tue, 3 Sep 2024 13:57:12 +0000 (15:57 +0200)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Mon, 9 Sep 2024 06:41:24 +0000 (06:41 +0000)
it seems that there is a possibility for the type detection to report a
folder as being a file

with this change, I am pretty sure that cannot happen any longer

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/csync/vio/csync_vio_local_win.cpp

index d0dec638a47913ed0c1ce1597d3a10702db16abd..76aa4a45a3a182d5399f77526b7f2c3d0e51bee1 100644 (file)
@@ -142,9 +142,11 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
   file_stat = std::make_unique<csync_file_stat_t>();
   file_stat->path = path.toUtf8();
 
+    const auto isDirectory = handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+
     if (vfs && vfs->statTypeVirtualFile(file_stat.get(), &handle->ffd)) {
       // all good
-    } else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
+    } else if ((handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) && !isDirectory) {
       // Detect symlinks, and treat junctions as symlinks too.
       if (handle->ffd.dwReserved0 == IO_REPARSE_TAG_SYMLINK
           || handle->ffd.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT) {
@@ -155,11 +157,10 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
           // but will also treat them normally for now.
           file_stat->type = ItemTypeFile;
       }
-    } else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
-                || handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
-              ) {
+    } else if ((handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE || handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) &&
+               !isDirectory) {
         file_stat->type = ItemTypeSkip;
-    } else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+    } else if (isDirectory) {
         file_stat->type = ItemTypeDirectory;
     } else {
         file_stat->type = ItemTypeFile;