From 61e8606edee86197046c16e6daf3130748b61275 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sat, 3 Feb 2024 18:16:41 +0100 Subject: [PATCH 1/3] cmake: Add option to build with asan --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index e49548fb8..642c81a2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ option(BUILD_EXAMPLES "Build examples." ON) option(BUILD_OMEMO "Build the OMEMO module" OFF) option(WITH_GSTREAMER "Build with GStreamer support for Jingle" OFF) option(WITH_QCA "Build with QCA for OMEMO or encrypted file sharing" ${Qca-qt${QT_VERSION_MAJOR}_FOUND}) +option(ENABLE_ASAN "Build with address sanitizer" OFF) set(QXMPP_TARGET QXmppQt${QT_VERSION_MAJOR}) set(QXMPPOMEMO_TARGET QXmppOmemoQt${QT_VERSION_MAJOR}) @@ -52,6 +53,12 @@ add_definitions( -DQT_NO_KEYWORDS ) +# Address sanitizer +if(ENABLE_ASAN) + add_compile_options(-fsanitize=address) + add_link_options(-fsanitize=address) +endif() + if(BUILD_OMEMO) add_definitions(-DBUILD_OMEMO) From e62816aed09ea65a6a8123923eedc9429b276b4b Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sat, 3 Feb 2024 18:17:09 +0100 Subject: [PATCH 2/3] Stream: Fix heap-use-after-free by destructing in correct order --- src/base/QXmppStream.cpp | 7 +++++++ src/base/QXmppStreamManagement.cpp | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/base/QXmppStream.cpp b/src/base/QXmppStream.cpp index 4e7c7276b..a749d15dc 100644 --- a/src/base/QXmppStream.cpp +++ b/src/base/QXmppStream.cpp @@ -43,6 +43,7 @@ class QXmppStreamPrivate { public: QXmppStreamPrivate(QXmppStream *stream); + ~QXmppStreamPrivate(); QString dataBuffer; QSslSocket *socket; @@ -63,6 +64,12 @@ QXmppStreamPrivate::QXmppStreamPrivate(QXmppStream *stream) { } +QXmppStreamPrivate::~QXmppStreamPrivate() +{ + // causes access to runningIqs, so call here + streamManager.resetCache(); +} + /// /// \typedef QXmppStream::IqResult /// diff --git a/src/base/QXmppStreamManagement.cpp b/src/base/QXmppStreamManagement.cpp index f3b183e1c..20f2bddbd 100644 --- a/src/base/QXmppStreamManagement.cpp +++ b/src/base/QXmppStreamManagement.cpp @@ -323,7 +323,6 @@ QXmppStreamManager::QXmppStreamManager(QXmppStream *stream) QXmppStreamManager::~QXmppStreamManager() { - resetCache(); } bool QXmppStreamManager::enabled() const From 3b58c9a14c3f2b4a64dd0c0513f4dc49e11795a3 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sat, 3 Feb 2024 18:21:54 +0100 Subject: [PATCH 3/3] tests: pubsubmanager: Fix odr-violation --- .../qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp index f7f57f9d1..8cc636f4f 100644 --- a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp +++ b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp @@ -25,8 +25,8 @@ using PSManager = QXmppPubSubManager; using Affiliation = QXmppPubSubAffiliation; using AffiliationType = QXmppPubSubAffiliation::Affiliation; -const char *ns_pubsub = "http://jabber.org/protocol/pubsub"; -const char *ns_pubsub_auto_create = "http://jabber.org/protocol/pubsub#auto-create"; +const char *XMLNS_PUBSUB = "http://jabber.org/protocol/pubsub"; +const char *XMLNS_PUBSUB_AUTO_CREATE = "http://jabber.org/protocol/pubsub#auto-create"; class TestEventManager : public QXmppClientExtension, public QXmppPubSubEventHandler { @@ -148,7 +148,7 @@ void tst_QXmppPubSubManager::testRequestFeatures() "")); auto features = expectFutureVariant>(future); - QCOMPARE(features, (QVector { ns_pubsub, ns_pubsub_auto_create })); + QCOMPARE(features, (QVector { XMLNS_PUBSUB, XMLNS_PUBSUB_AUTO_CREATE })); future = psManager->requestFeatures("juliet@capulet.lit"); test.expect(QStringLiteral("" @@ -162,7 +162,7 @@ void tst_QXmppPubSubManager::testRequestFeatures() "")); features = expectFutureVariant>(future); - QCOMPARE(features, (QVector { ns_pubsub, ns_pubsub_auto_create })); + QCOMPARE(features, (QVector { XMLNS_PUBSUB, XMLNS_PUBSUB_AUTO_CREATE })); future = psManager->requestFeatures("juliet@capulet.lit", QXmppPubSubManager::PubSub); test.expect(QStringLiteral("" @@ -189,7 +189,7 @@ void tst_QXmppPubSubManager::testRequestFeatures() "")); features = expectFutureVariant>(future); - QCOMPARE(features, (QVector { ns_pubsub, ns_pubsub_auto_create })); + QCOMPARE(features, (QVector { XMLNS_PUBSUB, XMLNS_PUBSUB_AUTO_CREATE })); future = psManager->requestFeatures("pubsub.shakespeare.lit", QXmppPubSubManager::Pep); test.expect(QStringLiteral("" @@ -216,7 +216,7 @@ void tst_QXmppPubSubManager::testRequestFeatures() "")); features = expectFutureVariant>(future); - QCOMPARE(features, (QVector { ns_pubsub, ns_pubsub_auto_create })); + QCOMPARE(features, (QVector { XMLNS_PUBSUB, XMLNS_PUBSUB_AUTO_CREATE })); } void tst_QXmppPubSubManager::testRequestPepFeatures() @@ -236,7 +236,7 @@ void tst_QXmppPubSubManager::testRequestPepFeatures() "")); auto features = expectFutureVariant>(future); - QCOMPARE(features, (QVector { ns_pubsub, ns_pubsub_auto_create })); + QCOMPARE(features, (QVector { XMLNS_PUBSUB, XMLNS_PUBSUB_AUTO_CREATE })); } void tst_QXmppPubSubManager::testFetchNodes()