Skip to content

Commit

Permalink
Merge pull request #3057 from nextcloud/bugfix/vfs-windows-lnk-files-…
Browse files Browse the repository at this point in the history
…freeze-issue

Fix VFX Windows .lnk files freeze/crash issue
  • Loading branch information
allexzander authored Apr 7, 2021
2 parents 4a7145f + 4b58c2b commit 5eb6834
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 3 deletions.
3 changes: 2 additions & 1 deletion src/csync/vio/csync_vio_local_win.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,8 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
file_stat->type = ItemTypeDirectory;
} else {
file_stat->type = ItemTypeFile;
// exclude ".lnk" files as they are not essential, but, causing troubles when enabling the VFS due to QFileInfo::isDir() and other methods are freezing, which causes the ".lnk" files to start hydrating and freezing the app eventually.
file_stat->type = !OCC::FileSystem::isLnkFile(path) ? ItemTypeFile : ItemTypeSoftLink;
}

/* Check for the hidden flag */
Expand Down
9 changes: 8 additions & 1 deletion src/libsync/discovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
*/

#include "discovery.h"
#include "common/filesystembase.h"
#include "common/syncjournaldb.h"
#include "syncfileitem.h"
#include <QDebug>
Expand Down Expand Up @@ -177,9 +178,15 @@ void ProcessDirectoryJob::process()
// local stat function.
// Recall file shall not be ignored (#4420)
bool isHidden = e.localEntry.isHidden || (f.first[0] == '.' && f.first != QLatin1String(".sys.admin#recall#"));
#ifdef Q_OS_WIN
// exclude ".lnk" files as they are not essential, but, causing troubles when enabling the VFS due to QFileInfo::isDir() and other methods are freezing, which causes the ".lnk" files to start hydrating and freezing the app eventually.
const bool isServerEntryWindowsShortcut = !e.localEntry.isValid() && e.serverEntry.isValid() && !e.serverEntry.isDirectory && FileSystem::isLnkFile(e.serverEntry.name);
#else
const bool isServerEntryWindowsShortcut = false;
#endif
if (handleExcluded(path._target, e.localEntry.name,
e.localEntry.isDirectory || e.serverEntry.isDirectory, isHidden,
e.localEntry.isSymLink))
e.localEntry.isSymLink || isServerEntryWindowsShortcut))
continue;

if (_queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original)) {
Expand Down
4 changes: 3 additions & 1 deletion src/libsync/vfs/cfapi/vfs_cfapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@ bool VfsCfApi::statTypeVirtualFile(csync_file_stat_t *stat, void *statData)
const auto hasReparsePoint = (ffd->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
const auto hasCloudTag = (ffd->dwReserved0 & IO_REPARSE_TAG_CLOUD) != 0;

const auto isWindowsShortcut = !isDirectory && FileSystem::isLnkFile(stat->path);

// It's a dir with a reparse point due to the placeholder info (hence the cloud tag)
// if we don't remove the reparse point flag the discovery will end up thinking
// it is a file... let's prevent it
Expand All @@ -195,7 +197,7 @@ bool VfsCfApi::statTypeVirtualFile(csync_file_stat_t *stat, void *statData)
} else if (isSparseFile && isPinned) {
stat->type = ItemTypeVirtualFileDownload;
return true;
} else if (!isSparseFile && isUnpinned){
} else if (!isSparseFile && isUnpinned && !isWindowsShortcut){
stat->type = ItemTypeVirtualFileDehydration;
return true;
} else if (isSparseFile) {
Expand Down

0 comments on commit 5eb6834

Please sign in to comment.