From 9160076aa25ccdd7a82d331ab0646ba793ad520f Mon Sep 17 00:00:00 2001 From: Marco Allegretti Date: Fri, 13 Feb 2026 13:11:49 +0100 Subject: [PATCH] runnerd: save registry and profiles atomically --- src/runner/runnermanagerdaemon.cpp | 31 ++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/runner/runnermanagerdaemon.cpp b/src/runner/runnermanagerdaemon.cpp index aeda07a..063a738 100644 --- a/src/runner/runnermanagerdaemon.cpp +++ b/src/runner/runnermanagerdaemon.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -201,7 +202,10 @@ void RunnerManagerDaemon::loadRegistry() bool RunnerManagerDaemon::saveRegistry() const { const QString path = registryPath(); - QDir().mkpath(QFileInfo(path).absolutePath()); + const QString dirPath = QFileInfo(path).absolutePath(); + if (!QDir().mkpath(dirPath)) { + return false; + } QJsonArray arr; @@ -221,13 +225,17 @@ bool RunnerManagerDaemon::saveRegistry() const QJsonObject root; root.insert(QStringLiteral("runners"), arr); - QFile f(path); + QSaveFile f(path); if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { return false; } - f.write(QJsonDocument(root).toJson(QJsonDocument::Indented)); - return true; + const QByteArray payload = QJsonDocument(root).toJson(QJsonDocument::Indented); + if (f.write(payload) != payload.size()) { + return false; + } + + return f.commit(); } QString RunnerManagerDaemon::gameProfilesPath() const @@ -267,7 +275,10 @@ void RunnerManagerDaemon::loadGameProfiles() bool RunnerManagerDaemon::saveGameProfiles() const { const QString path = gameProfilesPath(); - QDir().mkpath(QFileInfo(path).absolutePath()); + const QString dirPath = QFileInfo(path).absolutePath(); + if (!QDir().mkpath(dirPath)) { + return false; + } QJsonArray arr; for (auto it = m_gameProfiles.constBegin(); it != m_gameProfiles.constEnd(); ++it) { @@ -281,13 +292,17 @@ bool RunnerManagerDaemon::saveGameProfiles() const QJsonObject root; root.insert(QStringLiteral("profiles"), arr); - QFile f(path); + QSaveFile f(path); if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { return false; } - f.write(QJsonDocument(root).toJson(QJsonDocument::Indented)); - return true; + const QByteArray payload = QJsonDocument(root).toJson(QJsonDocument::Indented); + if (f.write(payload) != payload.size()) { + return false; + } + + return f.commit(); } QVariantMap RunnerManagerDaemon::gameProfileForGameId(const QString &gameId) const