diff options
author | Mitch Curtis <mitch.curtis@digia.com> | 2013-03-19 16:45:25 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-23 14:42:45 +0100 |
commit | a3304489e870555f5d01d02c0252103db2288898 (patch) | |
tree | ebf8314f9fa8812e227b078d7e6b943860cf2448 /src/corelib/io/qtemporaryfile.cpp | |
parent | 0450d8119028905823a393a5598eb350b8b5d377 (diff) |
Ensure QTemporaryFile can create files when an identical dir exists.
When QTemporaryFile attempts to create a new file in
createFileFromTemplate, it fails if the filename exists and is a
directory. Windows returns error code 5 (ERROR_ACCESS_DENIED) in this
case - rather than ERROR_FILE_EXISTS - which is not handled.
This patch handles ERROR_ACCESS_DENIED in addition to the already
handled ERROR_FILE_EXISTS, meaning that QTemporaryFile will continue
to look for unique names when a directory with the same name exists.
Task-number: QTBUG-30058
Change-Id: I42339887d7f5483e3dc6a03a9da15111c350da8f
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Diffstat (limited to 'src/corelib/io/qtemporaryfile.cpp')
-rw-r--r-- | src/corelib/io/qtemporaryfile.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index d3a6e3c238..c2f421843c 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -160,7 +160,14 @@ static bool createFileFromTemplate(NativeFileHandle &file, return true; DWORD err = GetLastError(); - if (err != ERROR_FILE_EXISTS) { + if (err == ERROR_ACCESS_DENIED) { + DWORD attributes = GetFileAttributes((const wchar_t *)path.constData()); + if (attributes == INVALID_FILE_ATTRIBUTES) { + // Potential write error (read-only parent directory, etc.). + error = QSystemError(err, QSystemError::NativeError); + return false; + } // else file already exists as a directory. + } else if (err != ERROR_FILE_EXISTS) { error = QSystemError(err, QSystemError::NativeError); return false; } |