From db758e9823500c572cd6db32ac6cb9a3ea469069 Mon Sep 17 00:00:00 2001 From: Ye ShanShan Date: Fri, 17 May 2024 15:55:11 +0800 Subject: [PATCH] fix: crashed when access DSGApplication::id early Add fallback, using fileName or cmdline as AppId. Remove assert for empty appId. --- src/dsgapplication.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/dsgapplication.cpp b/src/dsgapplication.cpp index cab17fb4..f1e73a27 100644 --- a/src/dsgapplication.cpp +++ b/src/dsgapplication.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -47,6 +48,15 @@ static bool isServiceActivatable(const QString &service) return activatableNames.value().contains(service); } +// Format appId to valid. +static QByteArray formatAppId(const QByteArray &appId) +{ + static const QRegularExpression regex("[^\\w\\-\\.]"); + QString format(QString::fromStdString(appId.toStdString())); + format = format.replace(regex, QStringLiteral(".")); + return format.toLocal8Bit(); +} + QByteArray DSGApplication::id() { static QByteArray selfId = getSelfAppId(); @@ -55,11 +65,23 @@ QByteArray DSGApplication::id() QByteArray result = selfId; if (!qEnvironmentVariableIsSet("DTK_DISABLED_FALLBACK_APPID")) { result = QCoreApplication::applicationName().toLocal8Bit(); + if (result.isEmpty()) { + QFile file("/proc/self/cmdline"); + if (file.open(QIODevice::ReadOnly)) + result = file.readLine(); + } + if (result.isEmpty()) { + const QFile file(QFile::symLinkTarget("/proc/self/exe")); + if (file.exists()) + result = file.fileName().toLocal8Bit(); + } + if (!result.isEmpty()) { + result = formatAppId(result); + qCDebug(dsgApp) << "The applicatiion ID is fallback to " << result; + } } - Q_ASSERT(!result.isEmpty()); - if (result.isEmpty()) { - qt_assert("The application ID is empty", __FILE__, __LINE__); - } + if (result.isEmpty()) + qCWarning(dsgApp) << "The application ID is empty."; return result; }