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
This commit is contained in:
Nicolas Werner 2021-12-17 05:53:34 +01:00
parent 88521caf0d
commit 09aded2bc8
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9
3 changed files with 20 additions and 13 deletions

View file

@ -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=")) {

View file

@ -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);

View file

@ -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");