diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c6f5f3fb..b122be124 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) diff --git a/src/base/QXmppStream.cpp b/src/base/QXmppStream.cpp index 7c49c7620..e82d4ca0f 100644 --- a/src/base/QXmppStream.cpp +++ b/src/base/QXmppStream.cpp @@ -39,6 +39,7 @@ class QXmppStreamPrivate { public: QXmppStreamPrivate(QXmppStream *stream); + ~QXmppStreamPrivate(); QString dataBuffer; QSslSocket *socket; @@ -59,6 +60,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 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()