void SshIncomingPacket::consumeData(QByteArray &newData) { #ifdef CREATOR_SSH_DEBUG qDebug("%s: current data size = %d, new data size = %d", Q_FUNC_INFO, m_data.size(), newData.size()); #endif if (isComplete() || newData.isEmpty()) return; /* * Until we have reached the minimum packet size, we cannot decrypt the * length field. */ const quint32 minSize = minPacketSize(); if (currentDataSize() < minSize) { const int bytesToTake = qMin<quint32>(minSize - currentDataSize(), newData.size()); moveFirstBytes(m_data, newData, bytesToTake); #ifdef CREATOR_SSH_DEBUG qDebug("Took %d bytes from new data", bytesToTake); #endif if (currentDataSize() < minSize) return; } if (4 + length() + macLength() < currentDataSize()) throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_PROTOCOL_ERROR, "Server sent invalid packet."); const int bytesToTake = qMin<quint32>(length() + 4 + macLength() - currentDataSize(), newData.size()); moveFirstBytes(m_data, newData, bytesToTake); #ifdef CREATOR_SSH_DEBUG qDebug("Took %d bytes from new data", bytesToTake); #endif if (isComplete()) { #ifdef CREATOR_SSH_DEBUG qDebug("Message complete. Overall size: %u, payload size: %u", m_data.size(), m_length - paddingLength() - 1); #endif decrypt(); ++m_serverSeqNr; } }
void SftpIncomingPacket::consumeData(QByteArray &newData) { #ifdef CREATOR_SSH_DEBUG qDebug("%s: current data size = %d, new data size = %d", Q_FUNC_INFO, m_data.size(), newData.size()); #endif if (isComplete() || dataSize() + newData.size() < sizeof m_length) return; if (dataSize() < sizeof m_length) { moveFirstBytes(m_data, newData, sizeof m_length - m_data.size()); m_length = SshPacketParser::asUint32(m_data, static_cast<quint32>(0)); if (m_length < static_cast<quint32>(TypeOffset + 1) || m_length > MaxPacketSize) { throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_PROTOCOL_ERROR, "Invalid length field in SFTP packet."); } } moveFirstBytes(m_data, newData, qMin<quint32>(m_length - dataSize() + 4, newData.size())); }