From 8112729eb0f13e6947984416118531078e65580d Mon Sep 17 00:00:00 2001 From: Aleix Pol Date: Wed, 16 Sep 2020 02:27:13 +0200 Subject: [PATCH] Don't brute-force reading the socket The package will arrive eventually, and dataReceived will be emitted. Otherwise we just end up calling dataReceived to no end. Thanks Matthias Gerstner for reporting this. --- core/backends/lan/socketlinereader.cpp | 8 ------- tests/testsocketlinereader.cpp | 31 ++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/core/backends/lan/socketlinereader.cpp b/core/backends/lan/socketlinereader.cpp index 11f053305..56c281ecc 100644 --- a/core/backends/lan/socketlinereader.cpp +++ b/core/backends/lan/socketlinereader.cpp @@ -24,14 +24,6 @@ void SocketLineReader::dataReceived() } } - //If we still have things to read from the socket, call dataReceived again - //We do this manually because we do not trust readyRead to be emitted again - //So we call this method again just in case. - if (m_socket->bytesAvailable() > 0) { - QMetaObject::invokeMethod(this, "dataReceived", Qt::QueuedConnection); - return; - } - //If we have any packets, tell it to the world. if (!m_packets.isEmpty()) { Q_EMIT readyRead(); diff --git a/tests/testsocketlinereader.cpp b/tests/testsocketlinereader.cpp index 0e3603d29..49d15b43a 100644 --- a/tests/testsocketlinereader.cpp +++ b/tests/testsocketlinereader.cpp @@ -13,16 +13,19 @@ #include #include #include +#include class TestSocketLineReader : public QObject { Q_OBJECT public Q_SLOTS: - void initTestCase(); + void init(); + void cleanup() { delete m_server; } void newPacket(); private Q_SLOTS: void socketLineReader(); + void badData(); private: QTimer m_timer; @@ -33,8 +36,9 @@ private: SocketLineReader* m_reader; }; -void TestSocketLineReader::initTestCase() +void TestSocketLineReader::init() { + m_packets.clear(); m_server = new Server(this); QVERIFY2(m_server->listen(QHostAddress::LocalHost, 8694), "Failed to create local tcp server"); @@ -85,6 +89,29 @@ void TestSocketLineReader::socketLineReader() } } +void TestSocketLineReader::badData() +{ + const QList dataToSend = { "data1\n", "data" }; //does not end in a \n + for (const QByteArray& line : qAsConst(dataToSend)) { + m_conn->write(line); + } + m_conn->flush(); + + QSignalSpy spy(m_server, &QTcpServer::newConnection); + QVERIFY(m_server->hasPendingConnections() || spy.wait(1000)); + QSslSocket* sock = m_server->nextPendingConnection(); + + QVERIFY2(sock != nullptr, "Could not open a connection to the client"); + + m_reader = new SocketLineReader(sock, this); + connect(m_reader, &SocketLineReader::readyRead, this, &TestSocketLineReader::newPacket); + m_timer.start(); + m_loop.exec(); + + QCOMPARE(m_packets.count(), 1); + QCOMPARE(m_packets[0], dataToSend[0]); +} + void TestSocketLineReader::newPacket() { int maxLoops = 5;