feat: add safe_sendErrorReply
crash when Not called from DBus (ApplicationService::setAutoStart)
This commit is contained in:
parent
4267b3b4b7
commit
84db7090d5
@ -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 {};
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -34,5 +34,5 @@ void InstanceService::KillAll(int signal)
|
||||
return;
|
||||
}
|
||||
|
||||
sendErrorReply(reply.errorName(), reply.errorMessage());
|
||||
safe_sendErrorReply(reply.errorName(), reply.errorMessage());
|
||||
}
|
||||
|
@ -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.");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user