summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2019-04-25 13:10:51 -0700
committerThiago Macieira <thiago.macieira@intel.com>2019-04-27 06:03:39 +0000
commita3acf568d1785d15ebf4d9973df6f9c277d5158a (patch)
tree1e404d0a087e21c9958ca555cb3f5b4fb5cc315d
parentb4cc29434769b1d6c08ab2fc76cdcc2dac5dede9 (diff)
Make QFile::copy() less likely to create zero-sized
QFile::copy() didn't have the syncToDisk() call that QSaveFile::commit() has. So add it. [ChangeLog][QtCore][QFile] Made QFile::copy() issue a filesystem- synchronization system call, which would make it less likely to result in incomplete or corrupt files if the system reboots or uncleanly shuts down soon after the function returns. New code is advised to use QSaveFile instead, which also allows to display a progress report while copying. Fixes: QTBUG-75407 Change-Id: I95ecabe2f50e450c991afffd1598d09ec73f6482 Reviewed-by: Henrik Hartz <hhartz@gmail.com> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
-rw-r--r--src/corelib/io/qfile.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 3166fa1b83..1fb9af576c 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -832,10 +832,16 @@ QFile::copy(const QString &newName)
error = true;
}
}
- if (!error && !out.rename(newName)) {
- error = true;
- close();
- d->setError(QFile::CopyError, tr("Cannot create %1 for output").arg(newName));
+
+ if (!error) {
+ // Sync to disk if possible. Ignore errors (e.g. not supported).
+ d->fileEngine->syncToDisk();
+
+ if (!out.rename(newName)) {
+ error = true;
+ close();
+ d->setError(QFile::CopyError, tr("Cannot create %1 for output").arg(newName));
+ }
}
#ifdef QT_NO_TEMPORARYFILE
if (error)