- Add upstream patches to fix security issues in kdeconnect (CVE-2020-26164, boo#1176268): * 0001-Do-not-leak-the-local-user-in-the-device-name.patch * 0002-Fix-use-after-free-in-LanLinkProvider-connectError.patch * 0003-Limit-identity-packets-to-8KiB.patch * 0004-Do-not-let-lanlink-connections-stay-open-for-long-wi.patch * 0005-Don-t-brute-force-reading-the-socket.patch * 0006-Limit-number-of-connected-sockets-from-unpaired-devi.patch * 0007-Do-not-remember-more-than-a-few-identity-packets-at-.patch * 0008-Limit-the-ports-we-try-to-connect-to-to-the-port-ran.patch * 0009-Do-not-replace-connections-for-a-given-deviceId-if-t.patch OBS-URL: https://build.opensuse.org/request/show/839167 OBS-URL: https://build.opensuse.org/package/show/KDE:Applications/kdeconnect-kde?expand=0&rev=17
103 lines
3.1 KiB
Diff
103 lines
3.1 KiB
Diff
From 721ba9faafb79aac73973410ee1dd3624ded97a5 Mon Sep 17 00:00:00 2001
|
|
From: Aleix Pol <aleixpol@kde.org>
|
|
Date: Wed, 16 Sep 2020 02:27:13 +0200
|
|
Subject: [PATCH 5/9] 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 <mgerstner@suse.de> 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 f67fdf3f..da77052a 100644
|
|
--- a/core/backends/lan/socketlinereader.cpp
|
|
+++ b/core/backends/lan/socketlinereader.cpp
|
|
@@ -38,14 +38,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 75584556..b6425b03 100644
|
|
--- a/tests/testsocketlinereader.cpp
|
|
+++ b/tests/testsocketlinereader.cpp
|
|
@@ -25,16 +25,19 @@
|
|
#include <QProcess>
|
|
#include <QEventLoop>
|
|
#include <QTimer>
|
|
+#include <QSignalSpy>
|
|
|
|
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;
|
|
@@ -45,8 +48,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");
|
|
@@ -97,6 +101,29 @@ void TestSocketLineReader::socketLineReader()
|
|
}
|
|
}
|
|
|
|
+void TestSocketLineReader::badData()
|
|
+{
|
|
+ const QList<QByteArray> 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()
|
|
{
|
|
if (!m_reader->bytesAvailable()) {
|
|
--
|
|
2.28.0
|
|
|