properly catch std::filesystem exceptions
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Tue, 8 Oct 2024 09:51:55 +0000 (11:51 +0200)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Tue, 8 Oct 2024 09:52:58 +0000 (11:52 +0200)
will prevent std::terminate from being called with uncatched exceptions

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/common/filesystembase.cpp
src/libsync/propagatedownload.cpp

index 42dc8dab06d49a331ce2f226b01b469e74ffee0d..765b081bffb07d101d68e4c2ca4c07af31ab8298 100644 (file)
@@ -115,15 +115,21 @@ void FileSystem::setFileReadOnly(const QString &filename, bool readonly)
         if (!fileExists(filename)) {
             return;
         }
-        const auto permissions = filePermissionsWin(filename);
+        try {
+            const auto permissions = filePermissionsWin(filename);
 
-        std::filesystem::perms allWritePermissions = std::filesystem::perms::_All_write;
-        static std::filesystem::perms defaultWritePermissions = std::filesystem::perms::others_write;
+            std::filesystem::perms allWritePermissions = std::filesystem::perms::_All_write;
+            static std::filesystem::perms defaultWritePermissions = std::filesystem::perms::others_write;
 
-        std::filesystem::permissions(filename.toStdString(), allWritePermissions, std::filesystem::perm_options::remove);
+            std::filesystem::permissions(filename.toStdString(), allWritePermissions, std::filesystem::perm_options::remove);
 
-        if (!readonly) {
-            std::filesystem::permissions(filename.toStdString(), defaultWritePermissions, std::filesystem::perm_options::add);
+            if (!readonly) {
+                std::filesystem::permissions(filename.toStdString(), defaultWritePermissions, std::filesystem::perm_options::add);
+            }
+        }
+        catch (std::filesystem::filesystem_error e)
+        {
+            qCWarning(lcFileSystem()) << filename << (readonly ? "readonly" : "read write") << e.what();
         }
     }
 #endif
@@ -155,14 +161,21 @@ bool FileSystem::setFileReadOnlyWeak(const QString &filename, bool readonly)
 {
 #ifdef Q_OS_WIN
     if (isLnkFile(filename)) {
-        const auto permissions = filePermissionsWin(filename);
+        try {
+            const auto permissions = filePermissionsWin(filename);
 
-        if (!readonly && static_cast<bool>((permissions & std::filesystem::perms::owner_write))) {
-            return false; // already writable enough
-        }
+            if (!readonly && static_cast<bool>((permissions & std::filesystem::perms::owner_write))) {
+                return false; // already writable enough
+            }
 
-        setFileReadOnly(filename, readonly);
-        return true;
+            setFileReadOnly(filename, readonly);
+            return true;
+        }
+        catch (std::filesystem::filesystem_error e)
+        {
+            qCWarning(lcFileSystem()) << filename << (readonly ? "readonly" : "read write") << e.what();
+        }
+        return false;
     }
 #endif
     QFile file(filename);
@@ -446,8 +459,15 @@ bool FileSystem::isWritable(const QString &filename, const QFileInfo &fileInfo)
 {
 #ifdef Q_OS_WIN
     if (isLnkFile(filename)) {
-        const auto permissions = filePermissionsWin(filename);
-        return static_cast<bool>((permissions & std::filesystem::perms::owner_write));
+        try {
+            const auto permissions = filePermissionsWin(filename);
+            return static_cast<bool>((permissions & std::filesystem::perms::owner_write));
+        }
+        catch (std::filesystem::filesystem_error e)
+        {
+            qCWarning(lcFileSystem()) << filename << e.what();
+        }
+        return false;
     }
 #endif
     bool re = fileInfo.isWritable();
@@ -465,8 +485,15 @@ bool FileSystem::isReadable(const QString &filename, const QFileInfo &fileInfo)
 {
 #ifdef Q_OS_WIN
     if (isLnkFile(filename)) {
-        const auto permissions = filePermissionsWin(filename);
-        return static_cast<bool>((permissions & std::filesystem::perms::owner_read));
+        try {
+            const auto permissions = filePermissionsWin(filename);
+            return static_cast<bool>((permissions & std::filesystem::perms::owner_read));
+        }
+        catch (std::filesystem::filesystem_error e)
+        {
+            qCWarning(lcFileSystem()) << filename << e.what();
+        }
+        return false;
     }
 #endif
     bool re = fileInfo.isReadable();
index 417f6bedc894332ca994d21ea664d9151b0ed2d8..9fcc3988fb78e43ae10514d4660b4c63c17c169a 100644 (file)
@@ -1205,10 +1205,16 @@ void PropagateDownloadFile::downloadFinished()
         // Preserve the existing file permissions.
         const auto existingFile = QFileInfo{filename};
 #ifdef Q_OS_WIN
-        const auto existingPermissions = FileSystem::filePermissionsWin(filename);
-        const auto tmpFilePermissions = FileSystem::filePermissionsWin(_tmpFile.fileName());
-        if (existingPermissions != tmpFilePermissions) {
-            FileSystem::setFilePermissionsWin(_tmpFile.fileName(), existingPermissions);
+        try {
+            const auto existingPermissions = FileSystem::filePermissionsWin(filename);
+            const auto tmpFilePermissions = FileSystem::filePermissionsWin(_tmpFile.fileName());
+            if (existingPermissions != tmpFilePermissions) {
+                FileSystem::setFilePermissionsWin(_tmpFile.fileName(), existingPermissions);
+            }
+        }
+        catch (std::filesystem::filesystem_error e)
+        {
+            qCWarning(lcPropagateDownload()) << _item->_instruction << _item->_file << e.what();
         }
 #else
         if (existingFile.permissions() != _tmpFile.permissions()) {