prevent cases where desktop client would store invalid modified time
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Tue, 7 Dec 2021 14:06:52 +0000 (15:06 +0100)
committerMatthieu Gallien (Rebase PR Action) <matthieu_gallien@yahoo.fr>
Wed, 8 Dec 2021 07:22:24 +0000 (07:22 +0000)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/owncloudpropagator.cpp
src/libsync/vfs/suffix/vfs_suffix.cpp
src/libsync/vfs/xattr/vfs_xattr.cpp

index f33f309d63f42efadb046ae31a9faceb7866aa58..38caf0e3c0479db5d09e60b2e1811159ad1535b7 100644 (file)
@@ -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);
         }
 
index a34d22382366161b3d56e30a23a50fac1c3d8024..ada1c46a44645c3b5930075e17747973f5ce5be3 100644 (file)
@@ -68,12 +68,20 @@ bool VfsSuffix::isHydrating() const
 
 Result<void, QString> 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<void, QString> 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())) {
index 614949ce5068ed7d5015967a9aa82aacd56278d6..ce3a64e3e21499cf83df101cf094a114e53805e6 100644 (file)
@@ -69,12 +69,20 @@ bool VfsXAttr::isHydrating() const
 
 Result<void, QString> 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<void, QString> 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