summaryrefslogtreecommitdiffstats
path: root/src/shared
diff options
context:
space:
mode:
authorSimon Rettberg2016-09-09 16:31:04 +0200
committerSimon Rettberg2016-09-09 16:31:04 +0200
commita39269e11e7c2d1843a4a4bf67749ae0224e4830 (patch)
tree9870de008a4ecd0fcf3902668cffb3f574e17ba4 /src/shared
parentRename lock/unlock scripts to kb-lock and kb-unlock so you know it's for the ... (diff)
downloadpvs2-a39269e11e7c2d1843a4a4bf67749ae0224e4830.tar.gz
pvs2-a39269e11e7c2d1843a4a4bf67749ae0224e4830.tar.xz
pvs2-a39269e11e7c2d1843a4a4bf67749ae0224e4830.zip
Fix infinite loop when receiving incomplete headers
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/networkmessage.cpp28
-rw-r--r--src/shared/networkmessage.h8
2 files changed, 20 insertions, 16 deletions
diff --git a/src/shared/networkmessage.cpp b/src/shared/networkmessage.cpp
index b0b82cd..6ab5d78 100644
--- a/src/shared/networkmessage.cpp
+++ b/src/shared/networkmessage.cpp
@@ -78,7 +78,7 @@ inline void NetworkMessage::allocBuffer()
}
}
-bool NetworkMessage::readMessage(QAbstractSocket* socket)
+int NetworkMessage::readMessage(QAbstractSocket* socket)
{
// Check/Set the _mode variable, so read and write calls are not mixed
if (_mode != 1)
@@ -86,7 +86,7 @@ bool NetworkMessage::readMessage(QAbstractSocket* socket)
if (_mode != 0)
{
qDebug("NetworkMessage::readMessage(TCP) called when class was in mode %d!", _mode);
- return false;
+ return NM_READ_FAILED;
}
_mode = 1;
}
@@ -94,15 +94,15 @@ bool NetworkMessage::readMessage(QAbstractSocket* socket)
if (_bufferSize == 0)
{
if (socket->bytesAvailable() < HEADER_LEN)
- return true;
+ return NM_READ_INCOMPLETE;
char header[HEADER_LEN];
if (socket->read(header, HEADER_LEN) != HEADER_LEN)
{
qDebug("FIXME: Socket said 8 bytes available, but could not read 8...");
- return false;
+ return NM_READ_FAILED;
}
if (!this->parseHeader(header))
- return false;
+ return NM_READ_FAILED;
//qDebug() << "Expecting message of " << _bufferSize << " bytes";
allocBuffer();
}
@@ -115,7 +115,7 @@ bool NetworkMessage::readMessage(QAbstractSocket* socket)
if (ret < 0)
{
qDebug("Socket read failed (TCP), return code %d", (int)ret);
- return false;
+ return NM_READ_FAILED;
}
_bufferPos += ret;
//qDebug() << "Buffer has now " << _bufferPos << " of " << _bufferSize << " bytes";
@@ -123,13 +123,13 @@ bool NetworkMessage::readMessage(QAbstractSocket* socket)
if (_bufferSize == _bufferPos)
{
if (!this->parseMessage(_buffer))
- return false;
+ return NM_READ_FAILED;
}
}
- return true;
+ return NM_READ_OK;
}
-bool NetworkMessage::readMessage(char* data, quint32 len)
+int NetworkMessage::readMessage(char* data, quint32 len)
{
// Check/Set the _mode variable, so read and write calls are not mixed
if (_mode != 1)
@@ -137,23 +137,23 @@ bool NetworkMessage::readMessage(char* data, quint32 len)
if (_mode != 0)
{
qDebug("NetworkMessage::readMessage(UDP) called when class was in mode %d!", _mode);
- return false;
+ return NM_READ_FAILED;
}
_mode = 1;
}
if (len < HEADER_LEN)
{
qDebug("UDP message shorter than 8 bytes. ignored.");
- return false;
+ return NM_READ_FAILED;
}
if (!this->parseHeader(data))
- return false;
+ return NM_READ_FAILED;
if (len != _bufferSize + HEADER_LEN)
{
qDebug("UDP packet has wrong size. Is %d, expected %d", (int)_bufferSize, len - HEADER_LEN);
- return false;
+ return NM_READ_FAILED;
}
- return this->parseMessage(data + HEADER_LEN);
+ return this->parseMessage(data + HEADER_LEN) ? NM_READ_OK : NM_READ_FAILED;
}
bool NetworkMessage::parseHeader(char *header)
diff --git a/src/shared/networkmessage.h b/src/shared/networkmessage.h
index 3742890..2e8c1c5 100644
--- a/src/shared/networkmessage.h
+++ b/src/shared/networkmessage.h
@@ -8,6 +8,10 @@
#ifndef NETWORKMESSAGE_H_
#define NETWORKMESSAGE_H_
+#define NM_READ_OK (1)
+#define NM_READ_INCOMPLETE (2)
+#define NM_READ_FAILED (0)
+
#include <QtCore>
class QAbstractSocket;
@@ -56,8 +60,8 @@ private:
public:
NetworkMessage();
virtual ~NetworkMessage();
- bool readMessage(QAbstractSocket* socket);
- bool readMessage(char* data, quint32 len);
+ int readMessage(QAbstractSocket* socket);
+ int readMessage(char* data, quint32 len);
bool writeMessage(QAbstractSocket * const socket);
bool writeMessage(QUdpSocket* socket, const QHostAddress& address, quint16 port);
void reset() { _fields.clear(); _bufferSize = 0; _mode = 0; }