Assert that we are starting a valid process launcher executable

Change-Id: I48b18bd4ce821d59622de77c602677303c9d7625
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Jarek Kobus
2021-08-19 14:01:40 +02:00
parent eca1247b95
commit ef45478707
2 changed files with 18 additions and 7 deletions

View File

@@ -25,8 +25,10 @@
#include "launcherinterface.h" #include "launcherinterface.h"
#include "filepath.h"
#include "launcherpackets.h" #include "launcherpackets.h"
#include "launchersocket.h" #include "launchersocket.h"
#include "qtcassert.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QDebug> #include <QDebug>
@@ -91,6 +93,7 @@ public:
Internal::LauncherSocket *socket() const { return m_socket; } Internal::LauncherSocket *socket() const { return m_socket; }
void setPathToLauncher(const QString &path) { if (!path.isEmpty()) m_pathToLauncher = path; } void setPathToLauncher(const QString &path) { if (!path.isEmpty()) m_pathToLauncher = path; }
QString launcherFilePath() const { return m_pathToLauncher + QLatin1String("/qtcreator_processlauncher"); }
signals: signals:
void errorOccurred(const QString &error); void errorOccurred(const QString &error);
@@ -132,8 +135,7 @@ void LauncherInterfacePrivate::doStart()
this, &LauncherInterfacePrivate::handleProcessFinished); this, &LauncherInterfacePrivate::handleProcessFinished);
connect(m_process, &QProcess::readyReadStandardError, connect(m_process, &QProcess::readyReadStandardError,
this, &LauncherInterfacePrivate::handleProcessStderr); this, &LauncherInterfacePrivate::handleProcessStderr);
const QString launcherPath = m_pathToLauncher + QLatin1String("/qtcreator_processlauncher"); m_process->start(launcherFilePath(), QStringList(m_server->fullServerName()));
m_process->start(launcherPath, QStringList(m_server->fullServerName()));
} }
void LauncherInterfacePrivate::doStop() void LauncherInterfacePrivate::doStop()
@@ -208,13 +210,23 @@ LauncherInterface::~LauncherInterface()
m_thread.wait(); m_thread.wait();
} }
// Called from main thread
void LauncherInterface::startLauncher(const QString &pathToLauncher) void LauncherInterface::startLauncher(const QString &pathToLauncher)
{ {
LauncherInterface &iface = instance();
iface.m_private->setPathToLauncher(pathToLauncher);
const FilePath launcherFilePath = FilePath::fromString(iface.m_private->launcherFilePath())
.cleanPath().withExecutableSuffix();
auto launcherIsNotExecutable = [&launcherFilePath]() {
qWarning() << "The Creator's process launcher"
<< launcherFilePath << "is not executable.";
};
QTC_ASSERT(launcherFilePath.isExecutableFile(), launcherIsNotExecutable());
// Call in launcher's thread. // Call in launcher's thread.
instance().m_private->setPathToLauncher(pathToLauncher); QMetaObject::invokeMethod(iface.m_private, &LauncherInterfacePrivate::doStart);
QMetaObject::invokeMethod(instance().m_private, &LauncherInterfacePrivate::doStart);
} }
// Called from main thread
void LauncherInterface::stopLauncher() void LauncherInterface::stopLauncher()
{ {
// Call in launcher's thread. // Call in launcher's thread.

View File

@@ -40,9 +40,6 @@ class QTCREATOR_UTILS_EXPORT LauncherInterface : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
static LauncherInterface &instance();
~LauncherInterface() override;
static void startLauncher(const QString &pathToLauncher = {}); static void startLauncher(const QString &pathToLauncher = {});
static void stopLauncher(); static void stopLauncher();
static Internal::LauncherSocket *socket(); static Internal::LauncherSocket *socket();
@@ -52,6 +49,8 @@ signals:
private: private:
LauncherInterface(); LauncherInterface();
static LauncherInterface &instance();
~LauncherInterface() override;
QThread m_thread; QThread m_thread;
Internal::LauncherInterfacePrivate *m_private; Internal::LauncherInterfacePrivate *m_private;