92 lines
5.1 KiB
Diff
92 lines
5.1 KiB
Diff
diff -Naur qt-everywhere-src-5.12.4-orig/qtbase/src/corelib/io/qfilesystemengine_win.cpp qt-everywhere-src-5.12.4/qtbase/src/corelib/io/qfilesystemengine_win.cpp
|
|
--- qt-everywhere-src-5.12.4-orig/qtbase/src/corelib/io/qfilesystemengine_win.cpp 2019-06-12 23:59:14.000000000 +0300
|
|
+++ qt-everywhere-src-5.12.4/qtbase/src/corelib/io/qfilesystemengine_win.cpp 2019-06-15 15:56:30.187254700 +0300
|
|
@@ -936,9 +936,10 @@
|
|
int errorCode = GetLastError();
|
|
if (errorCode == ERROR_ACCESS_DENIED || errorCode == ERROR_SHARING_VIOLATION) {
|
|
WIN32_FIND_DATA findData;
|
|
- if (getFindData(fname.nativeFilePath(), findData)
|
|
+ const QString nativeFilePath = fname.nativeFilePath();
|
|
+ if (getFindData(nativeFilePath, findData)
|
|
&& findData.dwFileAttributes != INVALID_FILE_ATTRIBUTES) {
|
|
- data.fillFromFindData(findData, true, fname.isDriveRoot());
|
|
+ data.fillFromFindData(findData, true, fname.isDriveRoot(), nativeFilePath);
|
|
filledData = true;
|
|
}
|
|
}
|
|
@@ -1053,8 +1054,9 @@
|
|
data.knownFlagsMask |= QFileSystemMetaData::LinkType;
|
|
if (data.fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT) {
|
|
WIN32_FIND_DATA findData;
|
|
- if (getFindData(fname.nativeFilePath(), findData))
|
|
- data.fillFromFindData(findData, true);
|
|
+ const QString nativeFilePath = fname.nativeFilePath();
|
|
+ if (getFindData(nativeFilePath, findData))
|
|
+ data.fillFromFindData(findData, true, false, nativeFilePath);
|
|
}
|
|
}
|
|
data.knownFlagsMask |= what;
|
|
diff -Naur qt-everywhere-src-5.12.4-orig/qtbase/src/corelib/io/qfilesystemiterator_win.cpp qt-everywhere-src-5.12.4/qtbase/src/corelib/io/qfilesystemiterator_win.cpp
|
|
--- qt-everywhere-src-5.12.4-orig/qtbase/src/corelib/io/qfilesystemiterator_win.cpp 2019-06-12 23:59:14.000000000 +0300
|
|
+++ qt-everywhere-src-5.12.4/qtbase/src/corelib/io/qfilesystemiterator_win.cpp 2019-06-15 15:56:30.187254700 +0300
|
|
@@ -133,7 +133,7 @@
|
|
fileEntry = QFileSystemEntry(dirPath + fileName);
|
|
metaData = QFileSystemMetaData();
|
|
if (!fileName.endsWith(QLatin1String(".lnk"))) {
|
|
- metaData.fillFromFindData(findData, true);
|
|
+ metaData.fillFromFindData(findData, true, false, fileEntry.nativeFilePath());
|
|
}
|
|
return true;
|
|
}
|
|
diff -Naur qt-everywhere-src-5.12.4-orig/qtbase/src/corelib/io/qfilesystemmetadata_p.h qt-everywhere-src-5.12.4/qtbase/src/corelib/io/qfilesystemmetadata_p.h
|
|
--- qt-everywhere-src-5.12.4-orig/qtbase/src/corelib/io/qfilesystemmetadata_p.h 2019-06-12 23:59:14.000000000 +0300
|
|
+++ qt-everywhere-src-5.12.4/qtbase/src/corelib/io/qfilesystemmetadata_p.h 2019-06-15 15:56:30.187254700 +0300
|
|
@@ -231,7 +231,7 @@
|
|
|
|
#if defined(Q_OS_WIN)
|
|
inline void fillFromFileAttribute(DWORD fileAttribute, bool isDriveRoot = false);
|
|
- inline void fillFromFindData(WIN32_FIND_DATA &findData, bool setLinkType = false, bool isDriveRoot = false);
|
|
+ inline void fillFromFindData(WIN32_FIND_DATA &findData, bool setLinkType = false, bool isDriveRoot = false, const QString &nativeFullFilePath = QString());
|
|
# ifndef Q_OS_WINRT
|
|
inline void fillFromFindInfo(BY_HANDLE_FILE_INFORMATION &fileInfo);
|
|
# endif
|
|
@@ -339,7 +339,7 @@
|
|
knownFlagsMask |= FileType | DirectoryType | HiddenAttribute | ExistsAttribute;
|
|
}
|
|
|
|
-inline void QFileSystemMetaData::fillFromFindData(WIN32_FIND_DATA &findData, bool setLinkType, bool isDriveRoot)
|
|
+inline void QFileSystemMetaData::fillFromFindData(WIN32_FIND_DATA &findData, bool setLinkType, bool isDriveRoot, const QString &nativeFullFilePath)
|
|
{
|
|
fillFromFileAttribute(findData.dwFileAttributes, isDriveRoot);
|
|
birthTime_ = findData.ftCreationTime;
|
|
@@ -359,14 +359,21 @@
|
|
if (setLinkType) {
|
|
knownFlagsMask |= LinkType;
|
|
entryFlags &= ~LinkType;
|
|
- if (fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT) {
|
|
- if (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK) {
|
|
- entryFlags |= LinkType;
|
|
-#if defined(IO_REPARSE_TAG_MOUNT_POINT)
|
|
- } else if ((fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY)
|
|
- && (findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT)) {
|
|
- entryFlags |= JunctionType;
|
|
-#endif
|
|
+ if (fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT) {
|
|
+ if (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK) {
|
|
+ entryFlags |= LinkType;
|
|
+ } else if (findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT) {
|
|
+ // Junctions and mount points are implemented as NTFS reparse points.
|
|
+ // But mount points cannot be treated as symlinks because they might
|
|
+ // not have a link target.
|
|
+ wchar_t buf[50];
|
|
+ QString path = nativeFullFilePath;
|
|
+ if (!path.endsWith(QLatin1Char('\\')))
|
|
+ path.append(QLatin1Char('\\'));
|
|
+ BOOL isMountPoint = GetVolumeNameForVolumeMountPoint(reinterpret_cast<const wchar_t*>(path.utf16()), buf, sizeof(buf) / sizeof(wchar_t));
|
|
+ if (!isMountPoint)
|
|
+ entryFlags |= LinkType;
|
|
+ }
|
|
}
|
|
}
|
|
}
|