diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2013-10-17 11:13:01 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-10-17 15:58:32 +0200 |
commit | 73e3d2f6cb002be4ce409c3738db74b61beb12f4 (patch) | |
tree | a8db9e073b37be9f7bc9610c3863e8eb0acc7758 /src/corelib/io | |
parent | 27316e097f95625aba19803ad8a47c4c0fece8fc (diff) |
Windows: Capture last error right after CreateDirectory() in QFileSystemEngine.
Custom allocators invoked by freeing the QString contents might change
it.
Task-number: QTBUG-34046
Task-number: QTBUG-32314
Change-Id: Ied5305c21fcce228448fe565899163997536ea7a
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/corelib/io')
-rw-r--r-- | src/corelib/io/qfilesystemengine_win.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp index 57231b57a9..257f18a6bb 100644 --- a/src/corelib/io/qfilesystemengine_win.cpp +++ b/src/corelib/io/qfilesystemengine_win.cpp @@ -965,8 +965,10 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM return data.hasFlags(what); } -static inline bool mkDir(const QString &path) +static inline bool mkDir(const QString &path, DWORD *lastError = 0) { + if (lastError) + *lastError = 0; #if defined(Q_OS_WINCE) // Unfortunately CreateDirectory returns true for paths longer than // 256, but does not create a directory. It starts to fail, when @@ -986,7 +988,11 @@ static inline bool mkDir(const QString &path) if (platformId == 1 && QFSFileEnginePrivate::longFileName(path).size() > 256) return false; #endif - return ::CreateDirectory((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16(), 0); + const QString longPath = QFSFileEnginePrivate::longFileName(path); + const bool result = ::CreateDirectory((wchar_t*)longPath.utf16(), 0); + if (lastError) // Capture lastError before any QString is freed since custom allocators might change it. + *lastError = GetLastError(); + return result; } static inline bool rmDir(const QString &path) @@ -1051,9 +1057,9 @@ bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool crea slash = dirName.length(); } if (slash) { + DWORD lastError; QString chunk = dirName.left(slash); - if (!mkDir(chunk)) { - const DWORD lastError = GetLastError(); + if (!mkDir(chunk, &lastError)) { if (lastError == ERROR_ALREADY_EXISTS || lastError == ERROR_ACCESS_DENIED) { bool existed = false; if (isDirPath(chunk, &existed) && existed) |