summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2021-12-17 05:53:34 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2021-12-17 05:58:09 +0100
commit09aded2bc8b447915511b26ebe71eab6ec98585a (patch)
tree5e99c631f9c6f5b7d37a8fec1fb61f58b4b141b6
parent88521caf0de7d08a951a7fdff2becdbf5ec391c9 (diff)
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
-rw-r--r--src/ChatPage.cpp7
-rw-r--r--src/ChatPage.h2
-rw-r--r--src/main.cpp24
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<std::string> 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");