generic: fix possible PID clamping

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2021-01-04 01:48:39 +02:00
parent 0ea27e5d09
commit a0547d6810
6 changed files with 38 additions and 38 deletions

View file

@ -75,7 +75,7 @@ public Q_SLOTS: // METHODS
return callWithArgumentList(QDBus::Block, QLatin1String("exec_blind"), argumentList); return callWithArgumentList(QDBus::Block, QLatin1String("exec_blind"), argumentList);
} }
inline QDBusReply<int> kdeinit_exec(const QString &app, const QStringList &args, const QStringList &env, const QString &startup_id, QString &dbusServiceName, QString &error, int &pid) inline QDBusReply<int> kdeinit_exec(const QString &app, const QStringList &args, const QStringList &env, const QString &startup_id, QString &dbusServiceName, QString &error, qint64 &pid)
{ {
QList<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << qVariantFromValue(app) << qVariantFromValue(args) << qVariantFromValue(env) << qVariantFromValue(startup_id); 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) { if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) {
dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1)); dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1));
error = qdbus_cast<QString>(reply.arguments().at(2)); error = qdbus_cast<QString>(reply.arguments().at(2));
pid = qdbus_cast<int>(reply.arguments().at(3)); pid = qdbus_cast<qint64>(reply.arguments().at(3));
} }
return reply; return reply;
} }
inline QDBusReply<int> kdeinit_exec_wait(const QString &app, const QStringList &args, const QStringList &env, const QString &startup_id, QString &dbusServiceName, QString &error, int &pid) inline QDBusReply<int> kdeinit_exec_wait(const QString &app, const QStringList &args, const QStringList &env, const QString &startup_id, QString &dbusServiceName, QString &error, qint64 &pid)
{ {
QList<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << qVariantFromValue(app) << qVariantFromValue(args) << qVariantFromValue(env) << qVariantFromValue(startup_id); 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) { if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) {
dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1)); dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1));
error = qdbus_cast<QString>(reply.arguments().at(2)); error = qdbus_cast<QString>(reply.arguments().at(2));
pid = qdbus_cast<int>(reply.arguments().at(3)); pid = qdbus_cast<qint64>(reply.arguments().at(3));
} }
return reply; return reply;
} }
@ -107,14 +107,14 @@ public Q_SLOTS: // METHODS
return callWithArgumentList(QDBus::Block, QLatin1String("reparseConfiguration"), argumentList); return callWithArgumentList(QDBus::Block, QLatin1String("reparseConfiguration"), argumentList);
} }
inline QDBusReply<int> requestHoldSlave(const QString &url, const QString &app_socket) inline QDBusReply<qint64> requestHoldSlave(const QString &url, const QString &app_socket)
{ {
QList<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << qVariantFromValue(url) << qVariantFromValue(app_socket); argumentList << qVariantFromValue(url) << qVariantFromValue(app_socket);
return callWithArgumentList(QDBus::Block, QLatin1String("requestHoldSlave"), argumentList); return callWithArgumentList(QDBus::Block, QLatin1String("requestHoldSlave"), argumentList);
} }
inline QDBusReply<int> requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error) inline QDBusReply<qint64> requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error)
{ {
QList<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << qVariantFromValue(protocol) << qVariantFromValue(host) << qVariantFromValue(app_socket); argumentList << qVariantFromValue(protocol) << qVariantFromValue(host) << qVariantFromValue(app_socket);
@ -132,7 +132,7 @@ public Q_SLOTS: // METHODS
return callWithArgumentList(QDBus::Block, QLatin1String("setLaunchEnv"), argumentList); return callWithArgumentList(QDBus::Block, QLatin1String("setLaunchEnv"), argumentList);
} }
inline QDBusReply<int> 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<int> 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<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << qVariantFromValue(serviceName) << qVariantFromValue(urls) << qVariantFromValue(envs) << qVariantFromValue(startup_id) << qVariantFromValue(blind); 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) { if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) {
dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1)); dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1));
error = qdbus_cast<QString>(reply.arguments().at(2)); error = qdbus_cast<QString>(reply.arguments().at(2));
pid = qdbus_cast<int>(reply.arguments().at(3)); pid = qdbus_cast<qint64>(reply.arguments().at(3));
} }
return reply; return reply;
} }
inline QDBusReply<int> 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<int> 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<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << qVariantFromValue(serviceName) << qVariantFromValue(urls) << qVariantFromValue(envs) << qVariantFromValue(startup_id) << qVariantFromValue(blind); 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) { if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) {
dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1)); dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1));
error = qdbus_cast<QString>(reply.arguments().at(2)); error = qdbus_cast<QString>(reply.arguments().at(2));
pid = qdbus_cast<int>(reply.arguments().at(3)); pid = qdbus_cast<qint64>(reply.arguments().at(3));
} }
return reply; return reply;
} }
inline QDBusReply<int> 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<int> 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<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << qVariantFromValue(serviceName) << qVariantFromValue(urls) << qVariantFromValue(envs) << qVariantFromValue(startup_id) << qVariantFromValue(blind); 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) { if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 4) {
dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1)); dbusServiceName = qdbus_cast<QString>(reply.arguments().at(1));
error = qdbus_cast<QString>(reply.arguments().at(2)); error = qdbus_cast<QString>(reply.arguments().at(2));
pid = qdbus_cast<int>(reply.arguments().at(3)); pid = qdbus_cast<qint64>(reply.arguments().at(3));
} }
return reply; return reply;
} }

View file

@ -1161,17 +1161,17 @@ bool KLauncher::checkForHeldSlave(const QString &url)
} }
void void
KLauncher::waitForSlave(int pid, QDBusMessage msg) KLauncher::waitForSlave(pid_t pid, QDBusMessage msg)
{ {
foreach (IdleSlave *slave, mSlaveList) foreach (IdleSlave *slave, mSlaveList)
{ {
if (slave->pid() == static_cast<pid_t>(pid)) if (slave->pid() == pid)
return; // Already here. return; // Already here.
} }
SlaveWaitRequest *waitRequest = new SlaveWaitRequest; SlaveWaitRequest *waitRequest = new SlaveWaitRequest;
msg.setDelayedReply(true); msg.setDelayedReply(true);
waitRequest->transaction = msg; waitRequest->transaction = msg;
waitRequest->pid = static_cast<pid_t>(pid); waitRequest->pid = pid;
mSlaveWaitRequest.append(waitRequest); mSlaveWaitRequest.append(waitRequest);
} }

View file

@ -237,7 +237,7 @@ public: // remote methods, called by KLauncherAdaptor
* @since 4.7 * @since 4.7
*/ */
bool checkForHeldSlave(const QString &url); bool checkForHeldSlave(const QString &url);
void waitForSlave(int pid, QDBusMessage msg); void waitForSlave(pid_t pid, QDBusMessage msg);
void terminate_kdeinit(); void terminate_kdeinit();
public Q_SLOTS: public Q_SLOTS:

View file

@ -60,21 +60,21 @@ void KLauncherAdaptor::exec_blind(const QString &name, const QStringList &arg_li
static_cast<KLauncher *>(parent())->exec_blind(name, arg_list, envs, startup_id); static_cast<KLauncher *>(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 // handle method call org.kde.KLauncher.kdeinit_exec
static_cast<KLauncher *>(parent())->kdeinit_exec(app, args, QString(), env, startup_id, false, msg); static_cast<KLauncher *>(parent())->kdeinit_exec(app, args, QString(), env, startup_id, false, msg);
return 0; // delayed reply 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 // handle method call org.kde.KLauncher.kdeinit_exec_wait
static_cast<KLauncher *>(parent())->kdeinit_exec(app, args, QString(), env, startup_id, true, msg); static_cast<KLauncher *>(parent())->kdeinit_exec(app, args, QString(), env, startup_id, true, msg);
return 0; // delayed reply 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 // handle method call org.kde.KLauncher.kdeinit_exec_with_workdir
static_cast<KLauncher *>(parent())->kdeinit_exec(app, args, workdir, env, startup_id, false, msg); static_cast<KLauncher *>(parent())->kdeinit_exec(app, args, workdir, env, startup_id, false, msg);
@ -87,13 +87,13 @@ void KLauncherAdaptor::reparseConfiguration()
static_cast<KLauncher *>(parent())->reparseConfiguration(); static_cast<KLauncher *>(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 // handle method call org.kde.KLauncher.requestHoldSlave
return static_cast<KLauncher *>(parent())->requestHoldSlave(KUrl(url), app_socket); return static_cast<KLauncher *>(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 // handle method call org.kde.KLauncher.requestSlave
return static_cast<KLauncher *>(parent())->requestSlave(protocol, host, app_socket, error); return static_cast<KLauncher *>(parent())->requestSlave(protocol, host, app_socket, error);
@ -110,7 +110,7 @@ void KLauncherAdaptor::setLaunchEnv(const QString &name, const QString &value)
static_cast<KLauncher *>(parent())->setLaunchEnv(name, value); static_cast<KLauncher *>(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 // handle method call org.kde.KLauncher.start_service_by_desktop_name
KLauncher *p = static_cast<KLauncher *>(parent()); KLauncher *p = static_cast<KLauncher *>(parent());
@ -121,7 +121,7 @@ int KLauncherAdaptor::start_service_by_desktop_name(const QString &serviceName,
return p->requestResult.result; 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 // handle method call org.kde.KLauncher.start_service_by_desktop_path
KLauncher *p = static_cast<KLauncher *>(parent()); KLauncher *p = static_cast<KLauncher *>(parent());
@ -132,7 +132,7 @@ int KLauncherAdaptor::start_service_by_desktop_path(const QString &serviceName,
return p->requestResult.result; 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 // handle method call org.kde.KLauncher.start_service_by_name
KLauncher *p = static_cast<KLauncher *>(parent()); KLauncher *p = static_cast<KLauncher *>(parent());
@ -143,7 +143,7 @@ int KLauncherAdaptor::start_service_by_name(const QString &serviceName, const QS
return p->requestResult.result; 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 // handle method call org.kde.KLauncher.waitForSlave
static_cast<KLauncher *>(parent())->waitForSlave(pid, msg); static_cast<KLauncher *>(parent())->waitForSlave(pid, msg);

View file

@ -48,19 +48,19 @@ public Q_SLOTS: // METHODS
void autoStart(int phase = 1); 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);
void exec_blind(const QString &name, const QStringList &arg_list, const QStringList &envs, const QString &startup_id); 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(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, 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, 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, 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, qint64 &pid);
void reparseConfiguration(); void reparseConfiguration();
int requestHoldSlave(const QString &url, const QString &app_socket); qint64 requestHoldSlave(const QString &url, const QString &app_socket);
int requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error); qint64 requestSlave(const QString &protocol, const QString &host, const QString &app_socket, QString &error);
bool checkForHeldSlave (const QString &url); bool checkForHeldSlave (const QString &url);
void setLaunchEnv(const QString &name, const QString &value); 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_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, 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, qint64 &pid);
// Deprecated, to be removed in KDE5. // 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); 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(int pid, const QDBusMessage &msg); void waitForSlave(qint64 pid, const QDBusMessage &msg);
void terminate_kdeinit(); void terminate_kdeinit();
Q_SIGNALS: // SIGNALS Q_SIGNALS: // SIGNALS
void autoStart0Done(); void autoStart0Done();

View file

@ -456,10 +456,10 @@ Slave* Slave::createSlave( const QString &protocol, const KUrl& url, int& error,
org::kde::KLauncher* klauncher = KToolInvocation::klauncher(); org::kde::KLauncher* klauncher = KToolInvocation::klauncher();
QString errorStr; QString errorStr;
QDBusReply<int> reply = klauncher->requestSlave(protocol, url.host(), slaveAddress, errorStr); QDBusReply<qint64> reply = klauncher->requestSlave(protocol, url.host(), slaveAddress, errorStr);
if (!reply.isValid()) { if (!reply.isValid()) {
error_text = i18n("Cannot talk to klauncher: %1", klauncher->lastError().message() ); error_text = i18n("Cannot talk to klauncher: %1", klauncher->lastError().message() );
error = KIO::ERR_CANNOT_LAUNCH_PROCESS; error = KIO::ERR_CANNOT_LAUNCH_PROCESS;
delete slave; delete slave;
return 0; return 0;
} }
@ -484,7 +484,7 @@ Slave* Slave::holdSlave( const QString &protocol, const KUrl& url )
return 0; return 0;
Slave *slave = new Slave(protocol); Slave *slave = new Slave(protocol);
QString slaveAddress = slave->d_func()->slaveconnserver->address(); QString slaveAddress = slave->d_func()->slaveconnserver->address();
QDBusReply<int> reply = KToolInvocation::klauncher()->requestHoldSlave(url.url(), slaveAddress); QDBusReply<qint64> reply = KToolInvocation::klauncher()->requestHoldSlave(url.url(), slaveAddress);
if (!reply.isValid()) { if (!reply.isValid()) {
delete slave; delete slave;
return 0; return 0;