From 41c86d645994849b9732becff40cd2b90ad55ff6 Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Tue, 7 Dec 2021 15:06:52 +0100 Subject: [PATCH] prevent cases where desktop client would store invalid modified time Signed-off-by: Matthieu Gallien --- src/libsync/owncloudpropagator.cpp | 7 +++++++ src/libsync/vfs/suffix/vfs_suffix.cpp | 8 ++++++++ src/libsync/vfs/xattr/vfs_xattr.cpp | 8 ++++++++ 3 files changed, 23 insertions(+) diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index f33f309d6..38caf0e3c 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -1126,6 +1126,13 @@ void PropagateDirectory::slotSubJobsFinished(SyncFileItem::Status status) if (_item->_instruction == CSYNC_INSTRUCTION_NEW && _item->_direction == SyncFileItem::Down) { // special case for local MKDIR, set local directory mtime // (it's not synced later at all, but can be nice to have it set initially) + + if (_item->_modtime <= 0) { + status = _item->_status = SyncFileItem::NormalError; + _item->_errorString = tr("Error updating metadata due to invalid modified time"); + qCWarning(lcDirectory) << "Error writing to the database for file" << _item->_file; + } + FileSystem::setModTime(propagator()->fullLocalPath(_item->destination()), _item->_modtime); } diff --git a/src/libsync/vfs/suffix/vfs_suffix.cpp b/src/libsync/vfs/suffix/vfs_suffix.cpp index a34d22382..ada1c46a4 100644 --- a/src/libsync/vfs/suffix/vfs_suffix.cpp +++ b/src/libsync/vfs/suffix/vfs_suffix.cpp @@ -68,12 +68,20 @@ bool VfsSuffix::isHydrating() const Result VfsSuffix::updateMetadata(const QString &filePath, time_t modtime, qint64, const QByteArray &) { + if (modtime <= 0) { + return {tr("Error updating metadata due to invalid modified time")}; + } + FileSystem::setModTime(filePath, modtime); return {}; } Result VfsSuffix::createPlaceholder(const SyncFileItem &item) { + if (item._modtime <= 0) { + return {tr("Error updating metadata due to invalid modified time")}; + } + // The concrete shape of the placeholder is also used in isDehydratedPlaceholder() below QString fn = _setupParams.filesystemPath + item._file; if (!fn.endsWith(fileSuffix())) { diff --git a/src/libsync/vfs/xattr/vfs_xattr.cpp b/src/libsync/vfs/xattr/vfs_xattr.cpp index 614949ce5..ce3a64e3e 100644 --- a/src/libsync/vfs/xattr/vfs_xattr.cpp +++ b/src/libsync/vfs/xattr/vfs_xattr.cpp @@ -69,12 +69,20 @@ bool VfsXAttr::isHydrating() const Result VfsXAttr::updateMetadata(const QString &filePath, time_t modtime, qint64, const QByteArray &) { + if (modtime <= 0) { + return {tr("Error updating metadata due to invalid modified time")}; + } + FileSystem::setModTime(filePath, modtime); return {}; } Result VfsXAttr::createPlaceholder(const SyncFileItem &item) { + if (item._modtime <= 0) { + return {tr("Error updating metadata due to invalid modified time")}; + } + const auto path = QString(_setupParams.filesystemPath + item._file); QFile file(path); if (file.exists() && file.size() > 1 -- 2.30.2