SSH: Don't use socket if it's in an unhealthy state.

This commit is contained in:
ck
2010-08-16 12:40:55 +02:00
parent b639a6e7c3
commit 358890c277
3 changed files with 18 additions and 4 deletions

View File

@@ -241,6 +241,8 @@ void SshConnectionPrivate::handleIncomingData()
return; // For stuff queued in the event loop after we've called closeConnection(); return; // For stuff queued in the event loop after we've called closeConnection();
try { try {
if (!canUseSocket())
return;
m_incomingData += m_socket->readAll(); m_incomingData += m_socket->readAll();
#ifdef CREATOR_SSH_DEBUG #ifdef CREATOR_SSH_DEBUG
qDebug("state = %d, remote data size = %d", m_state, qDebug("state = %d, remote data size = %d", m_state,
@@ -478,7 +480,8 @@ void SshConnectionPrivate::handleDisconnect()
void SshConnectionPrivate::sendData(const QByteArray &data) void SshConnectionPrivate::sendData(const QByteArray &data)
{ {
m_socket->write(data); if (canUseSocket())
m_socket->write(data);
} }
void SshConnectionPrivate::handleSocketDisconnected() void SshConnectionPrivate::handleSocketDisconnected()
@@ -543,10 +546,17 @@ void SshConnectionPrivate::closeConnection(SshErrorCode sshError,
emit error(userError); emit error(userError);
if (m_state == ConnectionEstablished) if (m_state == ConnectionEstablished)
emit disconnected(); emit disconnected();
m_socket->disconnectFromHost(); if (canUseSocket())
m_socket->disconnectFromHost();
m_state = SocketUnconnected; m_state = SocketUnconnected;
} }
bool SshConnectionPrivate::canUseSocket() const
{
return m_socket->isValid()
&& m_socket->state() == QAbstractSocket::ConnectedState;
}
QSharedPointer<SshRemoteProcess> SshConnectionPrivate::createRemoteProcess(const QByteArray &command) QSharedPointer<SshRemoteProcess> SshConnectionPrivate::createRemoteProcess(const QByteArray &command)
{ {
return m_channelManager->createRemoteProcess(command); return m_channelManager->createRemoteProcess(command);

View File

@@ -124,6 +124,7 @@ private:
void handleChannelEof(); void handleChannelEof();
void handleChannelClose(); void handleChannelClose();
void handleDisconnect(); void handleDisconnect();
bool canUseSocket() const;
void sendData(const QByteArray &data); void sendData(const QByteArray &data);

View File

@@ -48,8 +48,11 @@ void SshSendFacility::sendPacket()
#ifdef CREATOR_SSH_DEBUG #ifdef CREATOR_SSH_DEBUG
qDebug("Sending packet, client seq nr is %u", m_clientSeqNr); qDebug("Sending packet, client seq nr is %u", m_clientSeqNr);
#endif #endif
m_socket->write(m_outgoingPacket.rawData()); if (m_socket->isValid()
++m_clientSeqNr; && m_socket->state() == QAbstractSocket::ConnectedState) {
m_socket->write(m_outgoingPacket.rawData());
++m_clientSeqNr;
}
} }
void SshSendFacility::reset() void SshSendFacility::reset()