From a0547d6810fce814b32265edd31b5fcea20aff04 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Mon, 4 Jan 2021 01:48:39 +0200 Subject: [PATCH] generic: fix possible PID clamping Signed-off-by: Ivailo Monev --- kdecore/util/klauncher_iface.h | 24 ++++++++++++------------ kinit/klauncher.cpp | 6 +++--- kinit/klauncher.h | 2 +- kinit/klauncher_adaptor.cpp | 18 +++++++++--------- kinit/klauncher_adaptor.h | 18 +++++++++--------- kio/kio/slave.cpp | 8 ++++---- 6 files changed, 38 insertions(+), 38 deletions(-) diff --git a/kdecore/util/klauncher_iface.h b/kdecore/util/klauncher_iface.h index fc843d29..96b947d9 100644 --- a/kdecore/util/klauncher_iface.h +++ b/kdecore/util/klauncher_iface.h @@ -75,7 +75,7 @@ public Q_SLOTS: // METHODS return callWithArgumentList(QDBus::Block, QLatin1String("exec_blind"), argumentList); } - inline QDBusReply kdeinit_exec(const QString &app, const QStringList &args, const QStringList &env, const QString &startup_id, QString &dbusServiceName, QString &error, int &pid) + inline QDBusReply kdeinit_exec(const QString &app, const QStringList &args, const QStringList &env, const QString &startup_id, QString &dbusServiceName, QString &error, qint64 &pid) { QList argumentList; argumentList << qVariantFromValue(app) << qVariantFromValue(args) << qVariantFromValue(env) << qVariantFromValue(startup_id); @@ -83,12 +83,12 @@ public Q_SLOTS: // METHODS if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) { dbusServiceName = qdbus_cast(reply.arguments().at(1)); error = qdbus_cast(reply.arguments().at(2)); - pid = qdbus_cast(reply.arguments().at(3)); + pid = qdbus_cast(reply.arguments().at(3)); } return reply; } - inline QDBusReply kdeinit_exec_wait(const QString &app, const QStringList &args, const QStringList &env, const QString &startup_id, QString &dbusServiceName, QString &error, int &pid) + inline QDBusReply kdeinit_exec_wait(const QString &app, const QStringList &args, const QStringList &env, const QString &startup_id, QString &dbusServiceName, QString &error, qint64 &pid) { QList argumentList; argumentList << qVariantFromValue(app) << qVariantFromValue(args) << qVariantFromValue(env) << qVariantFromValue(startup_id); @@ -96,7 +96,7 @@ public Q_SLOTS: // METHODS if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) { dbusServiceName = qdbus_cast(reply.arguments().at(1)); error = qdbus_cast(reply.arguments().at(2)); - pid = qdbus_cast(reply.arguments().at(3)); + pid = qdbus_cast(reply.arguments().at(3)); } return reply; } @@ -107,14 +107,14 @@ public Q_SLOTS: // METHODS return callWithArgumentList(QDBus::Block, QLatin1String("reparseConfiguration"), argumentList); } - inline QDBusReply requestHoldSlave(const QString &url, const QString &app_socket) + inline QDBusReply requestHoldSlave(const QString &url, const QString &app_socket) { QList argumentList; argumentList << qVariantFromValue(url) << qVariantFromValue(app_socket); return callWithArgumentList(QDBus::Block, QLatin1String("requestHoldSlave"), argumentList); } - inline QDBusReply requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error) + inline QDBusReply requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error) { QList argumentList; argumentList << qVariantFromValue(protocol) << qVariantFromValue(host) << qVariantFromValue(app_socket); @@ -132,7 +132,7 @@ public Q_SLOTS: // METHODS return callWithArgumentList(QDBus::Block, QLatin1String("setLaunchEnv"), argumentList); } - inline QDBusReply start_service_by_desktop_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, QString &dbusServiceName, QString &error, int &pid) + inline QDBusReply start_service_by_desktop_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, QString &dbusServiceName, QString &error, qint64 &pid) { QList argumentList; argumentList << qVariantFromValue(serviceName) << qVariantFromValue(urls) << qVariantFromValue(envs) << qVariantFromValue(startup_id) << qVariantFromValue(blind); @@ -140,12 +140,12 @@ public Q_SLOTS: // METHODS if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) { dbusServiceName = qdbus_cast(reply.arguments().at(1)); error = qdbus_cast(reply.arguments().at(2)); - pid = qdbus_cast(reply.arguments().at(3)); + pid = qdbus_cast(reply.arguments().at(3)); } return reply; } - inline QDBusReply start_service_by_desktop_path(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, QString &dbusServiceName, QString &error, int &pid) + inline QDBusReply start_service_by_desktop_path(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, QString &dbusServiceName, QString &error, qint64 &pid) { QList argumentList; argumentList << qVariantFromValue(serviceName) << qVariantFromValue(urls) << qVariantFromValue(envs) << qVariantFromValue(startup_id) << qVariantFromValue(blind); @@ -153,12 +153,12 @@ public Q_SLOTS: // METHODS if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) { dbusServiceName = qdbus_cast(reply.arguments().at(1)); error = qdbus_cast(reply.arguments().at(2)); - pid = qdbus_cast(reply.arguments().at(3)); + pid = qdbus_cast(reply.arguments().at(3)); } return reply; } - inline QDBusReply start_service_by_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, QString &dbusServiceName, QString &error, int &pid) + inline QDBusReply start_service_by_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, QString &dbusServiceName, QString &error, qint64 &pid) { QList argumentList; argumentList << qVariantFromValue(serviceName) << qVariantFromValue(urls) << qVariantFromValue(envs) << qVariantFromValue(startup_id) << qVariantFromValue(blind); @@ -166,7 +166,7 @@ public Q_SLOTS: // METHODS if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) { dbusServiceName = qdbus_cast(reply.arguments().at(1)); error = qdbus_cast(reply.arguments().at(2)); - pid = qdbus_cast(reply.arguments().at(3)); + pid = qdbus_cast(reply.arguments().at(3)); } return reply; } diff --git a/kinit/klauncher.cpp b/kinit/klauncher.cpp index e340134b..7d54458f 100644 --- a/kinit/klauncher.cpp +++ b/kinit/klauncher.cpp @@ -1161,17 +1161,17 @@ bool KLauncher::checkForHeldSlave(const QString &url) } void -KLauncher::waitForSlave(int pid, QDBusMessage msg) +KLauncher::waitForSlave(pid_t pid, QDBusMessage msg) { foreach (IdleSlave *slave, mSlaveList) { - if (slave->pid() == static_cast(pid)) + if (slave->pid() == pid) return; // Already here. } SlaveWaitRequest *waitRequest = new SlaveWaitRequest; msg.setDelayedReply(true); waitRequest->transaction = msg; - waitRequest->pid = static_cast(pid); + waitRequest->pid = pid; mSlaveWaitRequest.append(waitRequest); } diff --git a/kinit/klauncher.h b/kinit/klauncher.h index 14a6dd04..cae27e62 100644 --- a/kinit/klauncher.h +++ b/kinit/klauncher.h @@ -237,7 +237,7 @@ public: // remote methods, called by KLauncherAdaptor * @since 4.7 */ bool checkForHeldSlave(const QString &url); - void waitForSlave(int pid, QDBusMessage msg); + void waitForSlave(pid_t pid, QDBusMessage msg); void terminate_kdeinit(); public Q_SLOTS: diff --git a/kinit/klauncher_adaptor.cpp b/kinit/klauncher_adaptor.cpp index fcf20920..a1453882 100644 --- a/kinit/klauncher_adaptor.cpp +++ b/kinit/klauncher_adaptor.cpp @@ -60,21 +60,21 @@ void KLauncherAdaptor::exec_blind(const QString &name, const QStringList &arg_li static_cast(parent())->exec_blind(name, arg_list, envs, startup_id); } -int KLauncherAdaptor::kdeinit_exec(const QString &app, const QStringList &args, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &, QString &, int &) +int KLauncherAdaptor::kdeinit_exec(const QString &app, const QStringList &args, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &, QString &, qint64 &) { // handle method call org.kde.KLauncher.kdeinit_exec static_cast(parent())->kdeinit_exec(app, args, QString(), env, startup_id, false, msg); return 0; // delayed reply } -int KLauncherAdaptor::kdeinit_exec_wait(const QString &app, const QStringList &args, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &, QString &, int &) +int KLauncherAdaptor::kdeinit_exec_wait(const QString &app, const QStringList &args, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &, QString &, qint64 &) { // handle method call org.kde.KLauncher.kdeinit_exec_wait static_cast(parent())->kdeinit_exec(app, args, QString(), env, startup_id, true, msg); return 0; // delayed reply } -int KLauncherAdaptor::kdeinit_exec_with_workdir(const QString &app, const QStringList &args, const QString& workdir, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &, QString &, int &) +int KLauncherAdaptor::kdeinit_exec_with_workdir(const QString &app, const QStringList &args, const QString& workdir, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &, QString &, qint64 &) { // handle method call org.kde.KLauncher.kdeinit_exec_with_workdir static_cast(parent())->kdeinit_exec(app, args, workdir, env, startup_id, false, msg); @@ -87,13 +87,13 @@ void KLauncherAdaptor::reparseConfiguration() static_cast(parent())->reparseConfiguration(); } -int KLauncherAdaptor::requestHoldSlave(const QString &url, const QString &app_socket) +qint64 KLauncherAdaptor::requestHoldSlave(const QString &url, const QString &app_socket) { // handle method call org.kde.KLauncher.requestHoldSlave return static_cast(parent())->requestHoldSlave(KUrl(url), app_socket); } -int KLauncherAdaptor::requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error) +qint64 KLauncherAdaptor::requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error) { // handle method call org.kde.KLauncher.requestSlave return static_cast(parent())->requestSlave(protocol, host, app_socket, error); @@ -110,7 +110,7 @@ void KLauncherAdaptor::setLaunchEnv(const QString &name, const QString &value) static_cast(parent())->setLaunchEnv(name, value); } -int KLauncherAdaptor::start_service_by_desktop_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, int &pid) +int KLauncherAdaptor::start_service_by_desktop_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, qint64 &pid) { // handle method call org.kde.KLauncher.start_service_by_desktop_name KLauncher *p = static_cast(parent()); @@ -121,7 +121,7 @@ int KLauncherAdaptor::start_service_by_desktop_name(const QString &serviceName, return p->requestResult.result; } -int KLauncherAdaptor::start_service_by_desktop_path(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, int &pid) +int KLauncherAdaptor::start_service_by_desktop_path(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, qint64 &pid) { // handle method call org.kde.KLauncher.start_service_by_desktop_path KLauncher *p = static_cast(parent()); @@ -132,7 +132,7 @@ int KLauncherAdaptor::start_service_by_desktop_path(const QString &serviceName, return p->requestResult.result; } -int KLauncherAdaptor::start_service_by_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, int &pid) +int KLauncherAdaptor::start_service_by_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, qint64 &pid) { // handle method call org.kde.KLauncher.start_service_by_name KLauncher *p = static_cast(parent()); @@ -143,7 +143,7 @@ int KLauncherAdaptor::start_service_by_name(const QString &serviceName, const QS return p->requestResult.result; } -void KLauncherAdaptor::waitForSlave(int pid, const QDBusMessage &msg) +void KLauncherAdaptor::waitForSlave(qint64 pid, const QDBusMessage &msg) { // handle method call org.kde.KLauncher.waitForSlave static_cast(parent())->waitForSlave(pid, msg); diff --git a/kinit/klauncher_adaptor.h b/kinit/klauncher_adaptor.h index 71949b52..660043a7 100644 --- a/kinit/klauncher_adaptor.h +++ b/kinit/klauncher_adaptor.h @@ -48,19 +48,19 @@ public Q_SLOTS: // METHODS void autoStart(int phase = 1); void exec_blind(const QString &name, const QStringList &arg_list); void exec_blind(const QString &name, const QStringList &arg_list, const QStringList &envs, const QString &startup_id); - int kdeinit_exec(const QString &app, const QStringList &args, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &dbusServiceName, QString &error, int &pid); - int kdeinit_exec_wait(const QString &app, const QStringList &args, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &dbusServiceName, QString &error, int &pid); - int kdeinit_exec_with_workdir(const QString &app, const QStringList &args, const QString& workdir, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &dbusServiceName, QString &error, int &pid); + int kdeinit_exec(const QString &app, const QStringList &args, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &dbusServiceName, QString &error, qint64 &pid); + int kdeinit_exec_wait(const QString &app, const QStringList &args, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &dbusServiceName, QString &error, qint64 &pid); + int kdeinit_exec_with_workdir(const QString &app, const QStringList &args, const QString& workdir, const QStringList &env, const QString& startup_id, const QDBusMessage &msg, QString &dbusServiceName, QString &error, qint64 &pid); void reparseConfiguration(); - int requestHoldSlave(const QString &url, const QString &app_socket); - int requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error); + qint64 requestHoldSlave(const QString &url, const QString &app_socket); + qint64 requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error); bool checkForHeldSlave (const QString &url); void setLaunchEnv(const QString &name, const QString &value); - int start_service_by_desktop_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, int &pid); - int start_service_by_desktop_path(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, int &pid); + int start_service_by_desktop_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, qint64 &pid); + int start_service_by_desktop_path(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, qint64 &pid); // Deprecated, to be removed in KDE5. - int start_service_by_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, int &pid); - void waitForSlave(int pid, const QDBusMessage &msg); + int start_service_by_name(const QString &serviceName, const QStringList &urls, const QStringList &envs, const QString &startup_id, bool blind, const QDBusMessage &msg, QString &dbusServiceName, QString &error, qint64 &pid); + void waitForSlave(qint64 pid, const QDBusMessage &msg); void terminate_kdeinit(); Q_SIGNALS: // SIGNALS void autoStart0Done(); diff --git a/kio/kio/slave.cpp b/kio/kio/slave.cpp index 34dde8ee..143c0eb2 100644 --- a/kio/kio/slave.cpp +++ b/kio/kio/slave.cpp @@ -456,10 +456,10 @@ Slave* Slave::createSlave( const QString &protocol, const KUrl& url, int& error, org::kde::KLauncher* klauncher = KToolInvocation::klauncher(); QString errorStr; - QDBusReply reply = klauncher->requestSlave(protocol, url.host(), slaveAddress, errorStr); + QDBusReply reply = klauncher->requestSlave(protocol, url.host(), slaveAddress, errorStr); if (!reply.isValid()) { - error_text = i18n("Cannot talk to klauncher: %1", klauncher->lastError().message() ); - error = KIO::ERR_CANNOT_LAUNCH_PROCESS; + error_text = i18n("Cannot talk to klauncher: %1", klauncher->lastError().message() ); + error = KIO::ERR_CANNOT_LAUNCH_PROCESS; delete slave; return 0; } @@ -484,7 +484,7 @@ Slave* Slave::holdSlave( const QString &protocol, const KUrl& url ) return 0; Slave *slave = new Slave(protocol); QString slaveAddress = slave->d_func()->slaveconnserver->address(); - QDBusReply reply = KToolInvocation::klauncher()->requestHoldSlave(url.url(), slaveAddress); + QDBusReply reply = KToolInvocation::klauncher()->requestHoldSlave(url.url(), slaveAddress); if (!reply.isValid()) { delete slave; return 0;