feat: add safe_sendErrorReply

crash when Not called from DBus (ApplicationService::setAutoStart)
This commit is contained in:
ck 2024-05-15 15:47:29 +08:00 committed by mike
parent 4267b3b4b7
commit 84db7090d5
5 changed files with 33 additions and 39 deletions

View File

@ -547,13 +547,13 @@ QString ApplicationManager1Service::Identify(const QDBusUnixFileDescriptor &pidf
auto pid = getPidFromPidFd(pidfd);
if (pid == 0) {
sendErrorReply(QDBusError::Failed, "pid is invalid");
safe_sendErrorReply(QDBusError::Failed, "pid is invalid");
return {};
}
const auto ret = m_identifier->Identify(pid);
if (ret.ApplicationId.isEmpty()) {
sendErrorReply(QDBusError::Failed, "Identify failed.");
safe_sendErrorReply(QDBusError::Failed, "Identify failed.");
return {};
}
@ -562,7 +562,7 @@ QString ApplicationManager1Service::Identify(const QDBusUnixFileDescriptor &pidf
});
if (app == m_applicationList.cend()) {
sendErrorReply(QDBusError::Failed, "can't find application:" % ret.ApplicationId);
safe_sendErrorReply(QDBusError::Failed, "can't find application:" % ret.ApplicationId);
return {};
}
@ -575,7 +575,7 @@ QString ApplicationManager1Service::Identify(const QDBusUnixFileDescriptor &pidf
instancePath = (*app)->findInstance(ret.InstanceId);
}
if (instancePath.path().isEmpty()) {
sendErrorReply(QDBusError::Failed, "can't find instance:" % ret.InstanceId);
safe_sendErrorReply(QDBusError::Failed, "can't find instance:" % ret.InstanceId);
return {};
}
@ -706,14 +706,14 @@ ApplicationManager1Service::findApplicationsByIds(const QStringList &appIds) con
QString ApplicationManager1Service::addUserApplication(const QVariantMap &desktop_file, const QString &name) noexcept
{
if (name.isEmpty()) {
sendErrorReply(QDBusError::Failed, "file name is empty.");
safe_sendErrorReply(QDBusError::Failed, "file name is empty.");
return {};
}
QDir xdgDataHome;
QString dir{getXDGDataHome() + "/applications"};
if (!xdgDataHome.mkpath(dir)) {
sendErrorReply(QDBusError::Failed, "couldn't create directory of user applications.");
safe_sendErrorReply(QDBusError::Failed, "couldn't create directory of user applications.");
return {};
}
@ -721,13 +721,13 @@ QString ApplicationManager1Service::addUserApplication(const QVariantMap &deskto
const auto &filePath = xdgDataHome.filePath(name);
if (QFileInfo info{filePath}; info.exists() and info.isFile()) {
sendErrorReply(QDBusError::Failed, QString{"file already exists:%1"}.arg(info.absoluteFilePath()));
safe_sendErrorReply(QDBusError::Failed, QString{"file already exists:%1"}.arg(info.absoluteFilePath()));
return {};
}
QFile file{filePath};
if (!file.open(QFile::NewOnly | QFile::WriteOnly | QFile::Text)) {
sendErrorReply(QDBusError::Failed, file.errorString());
safe_sendErrorReply(QDBusError::Failed, file.errorString());
return {};
}
@ -735,14 +735,14 @@ QString ApplicationManager1Service::addUserApplication(const QVariantMap &deskto
auto fileContent = DesktopFileGenerator::generate(desktop_file, errMsg);
if (fileContent.isEmpty() or !errMsg.isEmpty()) {
file.remove();
sendErrorReply(QDBusError::Failed, errMsg);
safe_sendErrorReply(QDBusError::Failed, errMsg);
return {};
}
auto writeContent = fileContent.toLocal8Bit();
if (file.write(writeContent) != writeContent.size()) {
file.remove();
sendErrorReply(QDBusError::Failed, "incomplete file content.this file will be removed.");
safe_sendErrorReply(QDBusError::Failed, "incomplete file content.this file will be removed.");
return {};
}
@ -753,13 +753,13 @@ QString ApplicationManager1Service::addUserApplication(const QVariantMap &deskto
if (err != ParserError::NoError) {
file.remove();
qDebug() << "add user's application failed:" << err;
sendErrorReply(QDBusError::Failed, "search failed.");
safe_sendErrorReply(QDBusError::Failed, "search failed.");
return {};
}
if (!ret) {
file.remove();
sendErrorReply(QDBusError::InternalError);
safe_sendErrorReply(QDBusError::InternalError);
return {};
}
@ -767,7 +767,7 @@ QString ApplicationManager1Service::addUserApplication(const QVariantMap &deskto
auto appId = desktopSource.desktopId();
if (!addApplication(std::move(desktopSource))) {
file.remove();
sendErrorReply(QDBusError::Failed, "add application to ApplicationManager failed.");
safe_sendErrorReply(QDBusError::Failed, "add application to ApplicationManager failed.");
return {};
}

View File

@ -232,9 +232,7 @@ ApplicationService::Launch(const QString &action, const QStringList &fields, con
if (!Actions) {
QString msg{"application can't be executed."};
qWarning() << msg;
if (calledFromDBus()) {
sendErrorReply(QDBusError::Failed, msg);
}
safe_sendErrorReply(QDBusError::Failed, msg);
return {};
}
@ -242,9 +240,7 @@ ApplicationService::Launch(const QString &action, const QStringList &fields, con
if (execStr.isEmpty()) {
QString msg{"maybe entry actions's format is invalid, abort launch."};
qWarning() << msg;
if (calledFromDBus()) {
sendErrorReply(QDBusError::Failed, msg);
}
safe_sendErrorReply(QDBusError::Failed, msg);
return {};
}
}
@ -258,18 +254,14 @@ ApplicationService::Launch(const QString &action, const QStringList &fields, con
auto cmds = generateCommand(optionsMap);
auto task = unescapeExec(execStr, fields);
if (!task) {
if (calledFromDBus()) {
sendErrorReply(QDBusError::InternalError, "Invalid Command.");
}
safe_sendErrorReply(QDBusError::InternalError, "Invalid Command.");
return {};
}
auto [bin, execCmds, res] = std::move(task);
if (bin.isEmpty()) {
qCritical() << "error command is detected, abort.";
if (calledFromDBus()) {
sendErrorReply(QDBusError::Failed);
}
safe_sendErrorReply(QDBusError::Failed);
return {};
}
@ -352,7 +344,7 @@ bool ApplicationService::SendToDesktop() const noexcept
auto success = m_desktopSource.sourceFileRef().link(desktopFile);
if (!success) {
qDebug() << "create link failed:" << m_desktopSource.sourceFileRef().errorString() << "path:" << desktopFile;
sendErrorReply(QDBusError::ErrorType::Failed, m_desktopSource.sourceFileRef().errorString());
safe_sendErrorReply(QDBusError::ErrorType::Failed, m_desktopSource.sourceFileRef().errorString());
}
return success;
@ -375,7 +367,7 @@ bool ApplicationService::RemoveFromDesktop() const noexcept
if (!success) {
qDebug() << "remove desktop file failed:" << desktopFile.errorString();
sendErrorReply(QDBusError::ErrorType::Failed, desktopFile.errorString());
safe_sendErrorReply(QDBusError::ErrorType::Failed, desktopFile.errorString());
}
return success;
@ -568,19 +560,19 @@ void ApplicationService::setEnviron(const QString &value) noexcept
auto storagePtr = m_storage.lock();
if (!storagePtr) {
qCritical() << "broken storage.";
sendErrorReply(QDBusError::InternalError);
safe_sendErrorReply(QDBusError::InternalError);
return;
}
auto appId = id();
if (!storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, Environ).isNull()) {
if (!storagePtr->updateApplicationValue(appId, ApplicationPropertiesGroup, Environ, value)) {
sendErrorReply(QDBusError::Failed, "update environ failed.");
safe_sendErrorReply(QDBusError::Failed, "update environ failed.");
return;
}
} else {
if (!storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, Environ, value)) {
sendErrorReply(QDBusError::Failed, "set environ failed.");
safe_sendErrorReply(QDBusError::Failed, "set environ failed.");
}
}
@ -664,7 +656,7 @@ void ApplicationService::setAutoStart(bool autostart) noexcept
QFile autostartFile{fileName};
if (!autostartFile.open(QFile::WriteOnly | QFile::Text | QFile::Truncate)) {
qWarning() << "open file" << fileName << "failed:" << autostartFile.error();
sendErrorReply(QDBusError::Failed);
safe_sendErrorReply(QDBusError::Failed);
return;
}
@ -690,7 +682,7 @@ void ApplicationService::setAutoStart(bool autostart) noexcept
if (writeBytes != hideAutostart.size() or !autostartFile.flush()) {
qWarning() << "incomplete write:" << autostartFile.error();
sendErrorReply(QDBusError::Failed, "set failed: filesystem error.");
safe_sendErrorReply(QDBusError::Failed, "set failed: filesystem error.");
return;
}
@ -755,7 +747,7 @@ void ApplicationService::setMimeTypes(const QStringList &value) noexcept
auto &infos = parent()->mimeManager().infos();
auto userInfo = std::find_if(infos.begin(), infos.end(), [](const MimeInfo &info) { return info.directory() == userDir; });
if (userInfo == infos.cend()) {
sendErrorReply(QDBusError::Failed, "user-specific config file doesn't exists.");
safe_sendErrorReply(QDBusError::Failed, "user-specific config file doesn't exists.");
return;
}

View File

@ -34,5 +34,5 @@ void InstanceService::KillAll(int signal)
return;
}
sendErrorReply(reply.errorName(), reply.errorMessage());
safe_sendErrorReply(reply.errorName(), reply.errorMessage());
}

View File

@ -92,7 +92,7 @@ void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) n
auto &app = m_infos.front().appsList();
if (app.empty()) {
sendErrorReply(QDBusError::InternalError);
safe_sendErrorReply(QDBusError::InternalError);
return;
}
@ -101,7 +101,7 @@ void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) n
if (userConfig == app.end()) {
qWarning() << "couldn't find user mimeApps";
sendErrorReply(QDBusError::InternalError);
safe_sendErrorReply(QDBusError::InternalError);
return;
}
@ -110,7 +110,7 @@ void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) n
}
if (!userConfig->writeToFile()) {
sendErrorReply(QDBusError::Failed, "set default app failed, these config will be reset after re-login.");
safe_sendErrorReply(QDBusError::Failed, "set default app failed, these config will be reset after re-login.");
}
}
@ -121,7 +121,7 @@ void MimeManager1Service::unsetDefaultApplication(const QStringList &mimeTypes)
if (userConfig == app.end()) {
qWarning() << "couldn't find user mimeApps";
sendErrorReply(QDBusError::InternalError);
safe_sendErrorReply(QDBusError::InternalError);
return;
}
@ -130,7 +130,7 @@ void MimeManager1Service::unsetDefaultApplication(const QStringList &mimeTypes)
}
if (!userConfig->writeToFile()) {
sendErrorReply(QDBusError::Failed, "unset default app failed, these config will be reset after re-login.");
safe_sendErrorReply(QDBusError::Failed, "unset default app failed, these config will be reset after re-login.");
}
}

View File

@ -651,4 +651,6 @@ inline int pidfd_open(pid_t pid, uint flags)
return syscall(SYS_pidfd_open, pid, flags);
}
#define safe_sendErrorReply if (calledFromDBus()) sendErrorReply
#endif