summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmad Samir <a.samirh78@gmail.com>2024-04-17 02:08:48 +0200
committerAhmad Samir <a.samirh78@gmail.com>2024-04-20 04:29:31 +0200
commitdf6b74f4617bf0ba14420ed15fcc5866cccfb7d0 (patch)
tree42eb97c82d52e266888fcb7b5e2dba623215c662
parentd691872b865c735f9d35886388c89f7ace7df5c8 (diff)
QFSFileEngine: update d->fileEntry after a successful rename
Otherwise member methods such as size() could return incorrect info. Add setFileEntry(QFileSystemEntry &&); to reuse a QFileSystemEntry if we have already constructed one. As a result of this, a QTemporaryFileEngine::setFileName() call has become redundant and can be removed; the code it executed is already taken care of: - QFSFileEngine::close(): already called by QTFEngine::rename() a couple of lines above - QFSFileEngine::setFileName(): QTFEngine::rename() calls QFSFileEngine::rename() which in turn updates the `fileEntry` This commit is covered by tst_QTemporaryFile::rename(), i.e. if QFSFileEngine::rename() didn't update the fileEntry, that test would fail. Change-Id: I312f35cf7fdf9b1a8cd0bce5e98ba7a48cf9426e Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/corelib/io/qfsfileengine.cpp21
-rw-r--r--src/corelib/io/qfsfileengine_p.h3
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp3
-rw-r--r--src/corelib/io/qtemporaryfile.cpp8
4 files changed, 27 insertions, 8 deletions
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp
index a4d0cc0e4f..f49106edd4 100644
--- a/src/corelib/io/qfsfileengine.cpp
+++ b/src/corelib/io/qfsfileengine.cpp
@@ -990,6 +990,17 @@ bool QFSFileEngine::remove()
return ret;
}
+/*
+ An alternative to setFileName() when you have already constructed
+ a QFileSystemEntry.
+*/
+void QFSFileEngine::setFileEntry(QFileSystemEntry &&entry)
+{
+ Q_D(QFSFileEngine);
+ d->init();
+ d->fileEntry = std::move(entry);
+}
+
bool QFSFileEngine::rename_helper(const QString &newName, RenameMode mode)
{
Q_D(QFSFileEngine);
@@ -997,10 +1008,14 @@ bool QFSFileEngine::rename_helper(const QString &newName, RenameMode mode)
auto func = mode == Rename ? QFileSystemEngine::renameFile
: QFileSystemEngine::renameOverwriteFile;
QSystemError error;
- const bool ret = func(d->fileEntry, QFileSystemEntry(newName), error);
- if (!ret)
+ auto newEntry = QFileSystemEntry(newName);
+ const bool ret = func(d->fileEntry, newEntry, error);
+ if (!ret) {
setError(QFile::RenameError, error.toString());
- return ret;
+ return false;
+ }
+ setFileEntry(std::move(newEntry));
+ return true;
}
/*!
diff --git a/src/corelib/io/qfsfileengine_p.h b/src/corelib/io/qfsfileengine_p.h
index 231ad9020a..dfc40e20b6 100644
--- a/src/corelib/io/qfsfileengine_p.h
+++ b/src/corelib/io/qfsfileengine_p.h
@@ -83,6 +83,7 @@ public:
bool setFileTime(const QDateTime &newDate, QFile::FileTime time) override;
QDateTime fileTime(QFile::FileTime time) const override;
void setFileName(const QString &file) override;
+ void setFileEntry(QFileSystemEntry &&entry);
int handle() const override;
#ifndef QT_NO_FILESYSTEMITERATOR
@@ -160,7 +161,7 @@ public:
bool isSequentialFdFh() const;
#endif
#ifdef Q_OS_WIN
- bool nativeRenameOverwrite(const QString &newName);
+ bool nativeRenameOverwrite(const QFileSystemEntry &newEntry);
#endif
uchar *map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags);
diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp
index 20f6f8e8ff..4ac305f49b 100644
--- a/src/corelib/io/qfsfileengine_win.cpp
+++ b/src/corelib/io/qfsfileengine_win.cpp
@@ -396,11 +396,10 @@ bool QFSFileEnginePrivate::nativeIsSequential() const
|| (fileType == FILE_TYPE_PIPE);
}
-bool QFSFileEnginePrivate::nativeRenameOverwrite(const QString &newName)
+bool QFSFileEnginePrivate::nativeRenameOverwrite(const QFileSystemEntry &newEntry)
{
if (fileHandle == INVALID_HANDLE_VALUE)
return false;
- QFileSystemEntry newEntry(newName, QFileSystemEntry::FromInternalPath());
const QString newFilePath = newEntry.nativeFilePath();
const size_t nameByteLength = newFilePath.length() * sizeof(wchar_t);
if (nameByteLength + sizeof(wchar_t) > std::numeric_limits<DWORD>::max())
diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index d76bc3b328..4e48a18d91 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -393,8 +393,13 @@ bool QTemporaryFileEngine::renameOverwrite(const QString &newName)
}
#ifdef Q_OS_WIN
if (flags & Win32NonShared) {
- bool ok = d_func()->nativeRenameOverwrite(newName);
+ QFileSystemEntry newEntry(newName, QFileSystemEntry::FromInternalPath());
+ bool ok = d_func()->nativeRenameOverwrite(newEntry);
QFSFileEngine::close();
+ if (ok) {
+ // Match what QFSFileEngine::renameOverwrite() does
+ setFileEntry(std::move(newEntry));
+ }
return ok;
}
#endif
@@ -868,7 +873,6 @@ bool QTemporaryFile::rename(const QString &newName)
if (tef->rename(newName)) {
unsetError();
// engine was able to handle the new name so we just reset it
- tef->setFileName(newName);
d->fileName = newName;
return true;
}