From b4996ab8e3a26d45ee55593da281e4b798c04dd2 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Tue, 23 Mar 2010 15:03:24 +0100 Subject: QFSFileEngine: don't look through NTFS junctions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Starting in 1216161584b730576c24fb128131838be1826b37, we started processing NTFS junctions as symbolic link. This reverts isSymlink() behavior back to former behavior and processes only symbolic junctions. The code path there worked just fine for directory symbolic links but lead to multiple issues for volume mount point junctions due to incompleteness. Task-number: QTBUG-7036, QTBUG-7384 Merge-request: 493 Reviewed-by: João Abecasis --- src/corelib/io/qfsfileengine_win.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index 9fc8dc3..eeca07e 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -1275,12 +1275,7 @@ static QString readSymLink(const QString &link) REPARSE_DATA_BUFFER *rdb = (REPARSE_DATA_BUFFER*)qMalloc(bufsize); DWORD retsize = 0; if (::DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, 0, 0, rdb, bufsize, &retsize, 0)) { - if (rdb->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) { - int length = rdb->MountPointReparseBuffer.SubstituteNameLength / sizeof(wchar_t); - int offset = rdb->MountPointReparseBuffer.SubstituteNameOffset / sizeof(wchar_t); - const wchar_t* PathBuffer = &rdb->MountPointReparseBuffer.PathBuffer[offset]; - result = QString::fromWCharArray(PathBuffer, length); - } else { + if (rdb->ReparseTag == IO_REPARSE_TAG_SYMLINK) { int length = rdb->SymbolicLinkReparseBuffer.SubstituteNameLength / sizeof(wchar_t); int offset = rdb->SymbolicLinkReparseBuffer.SubstituteNameOffset / sizeof(wchar_t); const wchar_t* PathBuffer = &rdb->SymbolicLinkReparseBuffer.PathBuffer[offset]; @@ -1543,8 +1538,7 @@ bool QFSFileEnginePrivate::isSymlink() const if (hFind != INVALID_HANDLE_VALUE) { ::FindClose(hFind); if ((findData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) - && (findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT - || findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK)) { + && findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK) { is_link = true; } } -- cgit v0.12