From 09aded2bc8b447915511b26ebe71eab6ec98585a Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 17 Dec 2021 05:53:34 +0100 Subject: [PATCH] Fix crash when receiving matrix uri It seems like handling the message in a blocking manner is a no-go. I have no idea how to fix that, so just use a queued connection for now... (ASAN does not cooperate and just hides the crash D:) fixes #842 --- src/ChatPage.cpp | 7 ++++--- src/ChatPage.h | 2 +- src/main.cpp | 24 +++++++++++++++--------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 7c6dde96..86e2141f 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -1252,10 +1252,10 @@ mxidFromSegments(QStringRef sigil, QStringRef mxid) } bool -ChatPage::handleMatrixUri(const QByteArray &uri) +ChatPage::handleMatrixUri(QString uri) { nhlog::ui()->info("Received uri! {}", uri.toStdString()); - QUrl uri_{QString::fromUtf8(uri)}; + QUrl uri_{uri}; // Convert matrix.to URIs to proper format if (uri_.scheme() == "https" && uri_.host() == "matrix.to") { @@ -1324,7 +1324,8 @@ ChatPage::handleMatrixUri(const QByteArray &uri) std::vector vias; QString action; - for (QString item : uri_.query(QUrl::ComponentFormattingOption::FullyEncoded).split('&')) { + for (QString item : + uri_.query(QUrl::ComponentFormattingOption::FullyEncoded).split('&', Qt::SkipEmptyParts)) { nhlog::ui()->info("item: {}", item.toStdString()); if (item.startsWith("action=")) { diff --git a/src/ChatPage.h b/src/ChatPage.h index c572f94b..31765356 100644 --- a/src/ChatPage.h +++ b/src/ChatPage.h @@ -78,7 +78,7 @@ public: QString currentRoom() const; public slots: - bool handleMatrixUri(const QByteArray &uri); + bool handleMatrixUri(QString uri); bool handleMatrixUri(const QUrl &uri); void startChat(QString userid); diff --git a/src/main.cpp b/src/main.cpp index b9134317..5a2cb413 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -277,22 +277,28 @@ main(int argc, char *argv[]) w.activateWindow(); }); + // It seems like handling the message in a blocking manner is a no-go. I have no idea how to + // fix that, so just use a queued connection for now... (ASAN does not cooperate and just + // hides the crash D:) QObject::connect( &app, &SingleApplication::receivedMessage, ChatPage::instance(), - [&](quint32, QByteArray message) { ChatPage::instance()->handleMatrixUri(message); }); + [&](quint32, QByteArray message) { + QString m = QString::fromUtf8(message); + ChatPage::instance()->handleMatrixUri(m); + }, + Qt::QueuedConnection); QMetaObject::Connection uriConnection; if (app.isPrimary() && !matrixUri.isEmpty()) { - uriConnection = - QObject::connect(ChatPage::instance(), - &ChatPage::contentLoaded, - ChatPage::instance(), - [&uriConnection, matrixUri]() { - ChatPage::instance()->handleMatrixUri(matrixUri.toUtf8()); - QObject::disconnect(uriConnection); - }); + uriConnection = QObject::connect(ChatPage::instance(), + &ChatPage::contentLoaded, + ChatPage::instance(), + [&uriConnection, matrixUri]() { + ChatPage::instance()->handleMatrixUri(matrixUri); + QObject::disconnect(uriConnection); + }); } QDesktopServices::setUrlHandler("matrix", ChatPage::instance(), "handleMatrixUri");