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

View File

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

View File

@ -34,5 +34,5 @@ void InstanceService::KillAll(int signal)
return; 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(); auto &app = m_infos.front().appsList();
if (app.empty()) { if (app.empty()) {
sendErrorReply(QDBusError::InternalError); safe_sendErrorReply(QDBusError::InternalError);
return; return;
} }
@ -101,7 +101,7 @@ void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) n
if (userConfig == app.end()) { if (userConfig == app.end()) {
qWarning() << "couldn't find user mimeApps"; qWarning() << "couldn't find user mimeApps";
sendErrorReply(QDBusError::InternalError); safe_sendErrorReply(QDBusError::InternalError);
return; return;
} }
@ -110,7 +110,7 @@ void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) n
} }
if (!userConfig->writeToFile()) { 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()) { if (userConfig == app.end()) {
qWarning() << "couldn't find user mimeApps"; qWarning() << "couldn't find user mimeApps";
sendErrorReply(QDBusError::InternalError); safe_sendErrorReply(QDBusError::InternalError);
return; return;
} }
@ -130,7 +130,7 @@ void MimeManager1Service::unsetDefaultApplication(const QStringList &mimeTypes)
} }
if (!userConfig->writeToFile()) { 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); return syscall(SYS_pidfd_open, pid, flags);
} }
#define safe_sendErrorReply if (calledFromDBus()) sendErrorReply
#endif #endif