SSH: Fix exit status/exit code interpretation

A "regular" exit of the ssh binary with exit code 255 means that the
remote process has crashed.

Change-Id: I82e6e44079041459e78e4f8f7e7b6e5cbcaa6c44
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Christian Kandeler
2018-12-14 10:12:59 +01:00
parent 2710a9b0e5
commit a5cf6f194d
3 changed files with 10 additions and 5 deletions

View File

@@ -68,7 +68,12 @@ SshRemoteProcess::SshRemoteProcess(const QByteArray &command, const QStringList
connect(this, connect(this,
static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
[this] { [this] {
emit done(exitStatus() == QProcess::NormalExit ? QString() : errorString()); QString error;
if (exitStatus() == QProcess::CrashExit)
error = tr("The ssh binary crashed: %1").arg(errorString());
else if (exitCode() == 255)
error = tr("Remote process crashed.");
emit done(error);
}); });
connect(this, &QProcess::errorOccurred, [this](QProcess::ProcessError error) { connect(this, &QProcess::errorOccurred, [this](QProcess::ProcessError error) {
if (error == QProcess::FailedToStart) if (error == QProcess::FailedToStart)

View File

@@ -139,7 +139,7 @@ QProcess::ProcessState SshDeviceProcess::state() const
QProcess::ExitStatus SshDeviceProcess::exitStatus() const QProcess::ExitStatus SshDeviceProcess::exitStatus() const
{ {
return d->exitStatus == QSsh::SshRemoteProcess::NormalExit return d->exitStatus == QSsh::SshRemoteProcess::NormalExit && d->exitCode != 255
? QProcess::NormalExit : QProcess::CrashExit; ? QProcess::NormalExit : QProcess::CrashExit;
} }
@@ -223,9 +223,9 @@ void SshDeviceProcess::handleProcessStarted()
emit started(); emit started();
} }
void SshDeviceProcess::handleProcessFinished() void SshDeviceProcess::handleProcessFinished(const QString &error)
{ {
d->errorMessage = d->process->errorString(); d->errorMessage = error;
d->exitCode = d->process->exitCode(); d->exitCode = d->process->exitCode();
d->setState(SshDeviceProcessPrivate::Inactive); d->setState(SshDeviceProcessPrivate::Inactive);
emit finished(); emit finished();

View File

@@ -60,7 +60,7 @@ private:
void handleConnectionError(); void handleConnectionError();
void handleDisconnected(); void handleDisconnected();
void handleProcessStarted(); void handleProcessStarted();
void handleProcessFinished(); void handleProcessFinished(const QString &error);
void handleStdout(); void handleStdout();
void handleStderr(); void handleStderr();
void handleKillOperationFinished(const QString &errorMessage); void handleKillOperationFinished(const QString &errorMessage);