From 826354e3da57a503322883e6a52db5329af8db10 Mon Sep 17 00:00:00 2001
From: Christian Kandeler <christian.kandeler@nokia.com>
Date: Thu, 17 Nov 2011 14:46:27 +0100
Subject: [PATCH] SSH: Fix packet size bug.

Uncovered by testing with dropbear.

Change-Id: Icd06ad5a20b568f7eef66d7f7381165cac4908d7
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
---
 src/libs/utils/ssh/sshchannel.cpp        | 7 ++++---
 src/libs/utils/ssh/sshoutgoingpacket.cpp | 3 +++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/libs/utils/ssh/sshchannel.cpp b/src/libs/utils/ssh/sshchannel.cpp
index 4fa68dc89e3..a6a864095c5 100644
--- a/src/libs/utils/ssh/sshchannel.cpp
+++ b/src/libs/utils/ssh/sshchannel.cpp
@@ -116,8 +116,8 @@ void AbstractSshChannel::handleWindowAdjust(quint32 bytesToAdd)
 
 void AbstractSshChannel::flushSendBuffer()
 {
-    const quint32 bytesToSend
-        = qMin<quint32>(m_remoteWindowSize, m_sendBuffer.size());
+    const quint32 bytesToSend = qMin(m_remoteMaxPacketSize,
+        qMin<quint32>(m_remoteWindowSize, m_sendBuffer.size()));
     if (bytesToSend > 0) {
         const QByteArray &data = m_sendBuffer.left(bytesToSend);
         m_sendFacility.sendChannelDataPacket(m_remoteChannel, data);
@@ -147,7 +147,8 @@ void AbstractSshChannel::handleOpenSuccess(quint32 remoteChannelId,
 #endif
    m_remoteChannel = remoteChannelId;
    m_remoteWindowSize = remoteWindowSize;
-   m_remoteMaxPacketSize = remoteMaxPacketSize;
+   m_remoteMaxPacketSize = remoteMaxPacketSize - sizeof(quint32) - sizeof m_remoteChannel - 1;
+        // Original value includes packet type, channel number and length field for string.
    setChannelState(SessionEstablished);
    handleOpenSuccessInternal();
 }
diff --git a/src/libs/utils/ssh/sshoutgoingpacket.cpp b/src/libs/utils/ssh/sshoutgoingpacket.cpp
index 2262fcd1ca7..d17b9003213 100644
--- a/src/libs/utils/ssh/sshoutgoingpacket.cpp
+++ b/src/libs/utils/ssh/sshoutgoingpacket.cpp
@@ -297,6 +297,9 @@ void SshOutgoingPacket::finalize()
     qDebug("Encrypting packet of type %u", m_data.at(TypeOffset));
 #endif
     encrypt();
+#ifdef CREATOR_SSH_DEBUG
+    qDebug("Sending packet of size %d", rawData().count());
+#endif
     Q_ASSERT(isComplete());
 }
 
-- 
GitLab