From a032bec8c429a3bdebdb5d2efb2be9423181948d Mon Sep 17 00:00:00 2001 From: Marco Allegretti Date: Fri, 13 Feb 2026 13:16:36 +0100 Subject: [PATCH] inputd: save profiles atomically --- src/input/inputdaemon.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/input/inputdaemon.cpp b/src/input/inputdaemon.cpp index ca1b9e1..907e3b1 100644 --- a/src/input/inputdaemon.cpp +++ b/src/input/inputdaemon.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -87,14 +88,6 @@ static QString gamepadTypeToString(SDL_GamepadType t) return QStringLiteral("unknown"); } } - -static QVariantMap unwrapVariantMap(QVariant v) -{ - if (v.canConvert()) { - return v.toMap(); - } - return {}; -} } QVariantMap InputDaemon::Profile::toVariantMap() const @@ -273,7 +266,10 @@ void InputDaemon::loadProfiles() bool InputDaemon::saveProfiles() const { const QString path = profilesPath(); - QDir().mkpath(QFileInfo(path).absolutePath()); + const QString dirPath = QFileInfo(path).absolutePath(); + if (!QDir().mkpath(dirPath)) { + return false; + } QJsonArray profiles; for (const Profile &p : m_profiles) { @@ -289,13 +285,17 @@ bool InputDaemon::saveProfiles() const root.insert(QStringLiteral("profiles"), profiles); root.insert(QStringLiteral("assignments"), assignments); - QFile f(path); + QSaveFile f(path); if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { return false; } - f.write(QJsonDocument(root).toJson()); - return true; + const QByteArray payload = QJsonDocument(root).toJson(); + if (f.write(payload) != payload.size()) { + return false; + } + + return f.commit(); } InputDaemon::Profile InputDaemon::profileById(const QString &profileId) const